2012-06-13 10 views
5

Ho ricevuto alcuni errori piuttosto strani nella compilazione del codice in gcc. Mi dice che std::function non esiste.non è un elemento di std

posso ricreare l'errore con il seguente codice:

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

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

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

Se corro gcc (da Cygwin):. (Il mio messaggio di errore era tedesco, così ho tradotto Può essere suono diverso su un inglese 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 

Con MSVC è stato compilato correttamente. Per favore dimmi cosa sto facendo male nel mio codice.

Johannes

+1

Stai compilando con C++ 11? – chris

+0

no, se faccio'gcc -std = C++ 0x test.cpp' getta un mucchio di errori di linker che non capisco – EGOrecords

+0

Hai bisogno di 'g ++', non 'gcc', vedi le risposte di seguito. – juanchopanza

risposta

13

compilarlo come:

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

-std=c++0x è necessario perché si sta utilizzando C++ 11 caratteristiche, altrimenti g++ test.cpp è sufficiente.

Assicurati di avere l'ultima versione di GCC. È possibile controllare la versione come:

g++ --version 
+1

"Se si utilizza gcc test.cpp, allora si assume il programma C!" Non vero. gcc deduce la lingua dall'estensione del file. Se presupponeva un programma C, il messaggio di errore sarebbe molto diverso. 'std :: function' sarebbe un errore di sintassi in C. Non produrrebbe un messaggio su' function' non esistente nello spazio dei nomi 'std'. Ciò che è vero è che 'gcc' (diversamente da' g ++') non si collega automaticamente alla libreria standard C++, quindi si otterrebbero errori di linker se non si specifica manualmente il flag -l appropriato. – sepp2k

3

È necessario compilare in modalità C++, e in modalità C++11. Quindi è necessario g++ e il flag -std impostato su c++0x.

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

È inoltre possibile utilizzare -std=c++11 da gcc 4.7 in poi.

Problemi correlati