2012-12-22 32 views
6

Khi cố gắng để biên dịch một lớp đơn giản (g++ myclass.cpp), tôi nhận được lỗi sau:ISO C++ cấm tuyên bố 'tuple' không có loại

ISO C++ forbids declaration of ‘tuple’ with no type 

Tôi đã tìm kiếm cho vấn đề này, và trong nhiều trường hợp người có vẻ để quên std:: hoặc bao gồm <tuple> trong tiêu đề. Nhưng tôi có cả hai. Đây là mã của tôi:

myclass.h

#ifndef MYCLASS 
#define MYCLASS 

#include <iostream> 
#include <tuple> 

class MyClass { 
    std::tuple<bool, int, int> my_method(); 
}; 

#endif 

MyClass.cpp

#include "myclass.h" 

using namespace std; 

tuple<bool, int, int> MyClass::my_method() { 
    return make_tuple(true, 1, 1); 
} 

Nếu tôi làm như vậy bằng pair thay vào đó, bỏ đi thứ hai int và bao gồm <set> , nó hoạt động.

Tôi đang thiếu gì?

EDIT:

Dưới đây là toàn bộ sản lượng:

$ g++ myclass.cpp -o prog 
In file included from myclass.cpp:1: 
myclass.h:7: error: ISO C++ forbids declaration of ‘tuple’ with no type 
myclass.h:7: error: invalid use of ‘::’ 
myclass.h:7: error: expected ‘;’ before ‘<’ token 
myclass.cpp:5: error: expected constructor, destructor, or type conversion before ‘<’ token 

$ g++ --version 
i686-apple-darwin11-llvm-g++-4.2 (GCC) 4.2.1 (Based on Apple Inc. build 5658) 
(LLVM build 2336.11.00) 
+5

Bạn có chỉ định '-std = C++ 11' khi biên dịch mã không? –

+5

'sử dụng không gian tên std;' - Thật là một lời báng bổ! –

+0

Không thể tạo lại lỗi này. Bạn có chắc chắn rằng bạn đã sử dụng chính xác mã này không? Bạn nên đánh dấu dòng chính xác g ++ được báo cáo. – Zeta

Trả lời

12

GCC 4.2.1 được vận chuyển với mọi máy Mac đã lỗi thời. Nó sẽ không nhận ra C++ 11.

Bạn cần biên dịch mã của mình bằng cách sử dụng: C++ thay vì g ++ gọi clang, đây là trình biên dịch được cập nhật chính thức trên mac.

c++ -std=c++11 -stdlib=libc++ myclass.cpp -o prog 

Bạn được yêu cầu phải liên kết chống lại libC++ đó là lib kêu vang mà biết về C++ 11 tính năng thay vì mặc định libstdC++ sử dụng bởi gcc.

+1

Có lý do nào không, tại sao trên máy Mac 2012 của tôi (OS X 10.8.2, Xcode mới nhất) tôi sẽ có một GCC cũ? (Tôi đã không cài đặt nó bản thân mình, Xcode có lẽ đã làm). Tôi sợ phá vỡ môi trường của mình nếu tôi cố cập nhật. – Jawap

+0

Không bình thường. Apple đã chuyển sang clang và giảm gcc nhưng họ giữ nó không phá vỡ khả năng tương thích retro. – Kikohs

+0

Có khả năng bạn sẽ phá vỡ môi trường của bạn nếu bạn cố gắng cập nhật gcc. Sử dụng tiếng kêu, nó nhanh hơn ... – Kikohs

1

Nếu bạn thêm -std=c++11 (hoặc, đối với phiên bản cũ của g++ các -std=c++0x) lựa chọn và thêm một simicolon sau biểu thức trong hàm thành viên mã biên dịch. Nếu điều này không hoạt động, bạn có thể có một phiên bản chỉ định nghĩa tuple trong không gian tên std::tr1 (có vẻ như, việc triển khai cung cấp một tiêu đề <tuple>, bởi vì không có lỗi về <tuple> không được tìm thấy).

5

Cập nhật! Chúng tôi đang ở trên GCC 4.7 những ngày này.

GCC 4.2.1 là từ tất cả các con đường trở lại trên 18th July, 2007. Chỉ có một cơ hội từ xa hỗ trợ mọi tính năng từ những gì đã trở thành C++ 11.

Điều đó nói rằng, nó có thể cung cấp một số trong std::tr1 (tức là std::tr1::tuple<T1, T2, ...>), đây là nơi một số tính năng C++ 11 tồn tại trong thời gian trước khi chuẩn hóa, mặc dù ngoài đầu chúng. 4.4.

+1

Có lý do nào không, tại sao trên máy Mac 2012 của tôi (OS X 10.8.2, Xcode mới nhất) tôi sẽ có một GCC cũ? (Tôi đã không cài đặt nó bản thân mình, Xcode có lẽ đã làm). Tôi sợ phá vỡ môi trường của tôi nếu tôi cố gắng cập nhật. – Jawap

+0

@Jawap: Đánh bại tôi. Yêu cầu đội bao bì. –

+1

Bạn không nên cập nhật gcc trên mac. Nó sẽ phá vỡ tính tương thích. Bạn có thể có gcc nhưng không có trong/usr/bin/gcc – Kikohs

3

Với gcc 4.2, tuple nằm trong không gian tên std::tr1.Bạn phải bao gồm <tr1/tuple> và chỉ định phương pháp của bạn nhiều hay ít như thế này

#ifndef MYCLASS 
#define MYCLASS 

#include <tr1/tuple> 

class MyClass { 
    std::tr1::tuple<bool, int, int> my_method(); 
}; 

#endif 

Mặc dù, như những người khác đã gợi ý, cập nhật lên một gcc gần đây hơn có thể thích hợp hơn.

Các vấn đề liên quan