2012-06-13 30 views
5

Tôi nhận được một số lỗi khá lạ khi biên dịch mã theo gcc. Nó cho tôi biết rằng std::function không tồn tại.không phải là một phần tử của std

tôi có thể tái tạo lại lỗi với đoạn mã sau:

#include <functional> 
#include <stdio.h> 

void test(){ printf ("test"); } 

int main() { 
    std::function<void()> f; 
    f = test; 
    f(); 
} 

Nếu tôi chạy gcc (từ Cygwin):. (Thông báo lỗi của tôi là Đức, vì vậy tôi dịch nó Nó có thể là âm thanh khác nhau trên một Tiếng Anh gcc)

$ gcc test.cpp 
test.cpp: in function "int main(): 
test.cpp:7:3: Error: "function" is not an element of "std"« 
test.cpp:7:25: Error: "f" was not defined in this scope 

Với MSVC nó được biên dịch thành công. Hãy cho tôi biết những gì tôi đang làm sai trong mã của tôi.

Johannes

+1

Bạn có đang biên dịch bằng C++ 11 không? – chris

+0

không, nếu tôi làm ´gcc -std = C++ 0x test.cpp´ nó ném một loạt các lỗi liên kết tôi không thể hiểu được – EGOrecords

+0

Bạn cần 'g ++', không phải' gcc', xem câu trả lời bên dưới. – juanchopanza

Trả lời

13

Compile nó như:

g++ test.cpp -std=c++0x 

-std=c++0x là cần thiết bởi vì bạn đang sử dụng C++ 11 tính năng, nếu không g++ test.cpp là đủ.

Đảm bảo bạn có phiên bản GCC mới nhất. Bạn có thể kiểm tra phiên bản như:

g++ --version 
+1

"Nếu bạn sử dụng test.cpp gcc, thì nó giả định chương trình C!" Không đúng. gcc infers ngôn ngữ từ phần mở rộng tập tin. Nếu nó giả định một chương trình C, thông báo lỗi sẽ khá khác nhau. 'std :: function' sẽ là một lỗi cú pháp trong C. Nó sẽ không tạo ra một thông báo về' hàm' không tồn tại trong không gian tên 'std'. Điều gì là đúng là 'gcc' (không giống như' g ++ ') không tự động liên kết với thư viện chuẩn C++, vì vậy bạn sẽ nhận được các lỗi liên kết nếu bạn không chỉ định cờ -l thích hợp theo cách thủ công. – sepp2k

3

Bạn cần phải biên dịch trong chế độ C++, và trong chế độ C++11. Vì vậy, bạn cần g++ và cờ -std được đặt thành c++0x.

g ++ test.cpp -std = C++ 0x

Bạn cũng có thể sử dụng -std=c++11 từ gcc 4.7 trở đi.

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