2011-06-29 7 views
5

Mam problemy z pracy z funkcji lambda w kompilator Intela, w szczególności, poniższy kod nie będzie kompilować:std :: funkcja <> i kompilator wersja Intel 11,1

template<typename T> 
std::function<T (int)> make_func(T x) { 
    return [=](int index) -> T 
    { 
    return x; 
    }; 
} 

błędu I Otrzymasz:

Kod kompiluje się i działa poprawnie na moim Macu (Macports gcc wersja 4.5). Błąd działa, gdy używamy kompilatora Intel w wersji 11.1. Czyni zaakceptować funkcje lambda (z -std = C++ 0x opcji), takie jak:

auto lam = [=](int j) -> int { 
    printf("testing for lambdas: %d\t%d\n", n, j); 
    return n; 
}; 

int g = lam(7); 

Wersja gcc zainstalowany w miejscu pracy jest 4.1.2, więc zgaduję, że standardowe biblioteki stary?

/bin/libc.so.6 

mówi, że to wersja 2.5 skompilowane z gcc 4.1.2.

Czy istnieje sposób obejścia tego?

Dzięki z góry za wszelką pomoc

+2

Czy dodałeś ''? –

Odpowiedz

5

To samo zachowanie występuje w przypadku ICC 11.1 w systemie, w którym zainstalowany jest gcc 4.5.2.

g++ Nagłówek <functional> jest chroniony przez #ifdef __GXX_EXPERIMENTAL_CXX0X__, który nie jest zdefiniowany, gdy używany jest icc.

Chciałbym rozważyć przejście na boost::function w tej konfiguracji, co oczywiście działa z icc.

+0

Dzięki za odpowiedź. Czy po prostu #define __GXX_EXPERIMENTAL_CXX0X__, przed #include uzyskać pożądany wynik? Spróbuję, kiedy jutro wrócę do pracy. Wolę trzymać się z daleka od tego konkretnego projektu. Dzięki jeszcze raz. –

+0

@ nmaxwell Próbowałem tego i icc dławił się szablonami varadic znajdującymi się wszędzie w bibliotekach gcc 4.5.2. Nie wiem, czy nagłówki w gcc 4.1.2 je mają. Z drugiej strony funkcja boost.hpp jest biblioteką tylko nagłówkową, którą można dodać bez wielu zależności. – Cubbi

1

dobrze, kod pokazany nie obejmuje pojedynczy cel. A jednak odwołujesz się do standardowej biblioteki std::function.

Więc nie, nie kompiluje. Podobnie jak w przypadku każdej innej części standardowej biblioteki, musisz podać nagłówek, w którym zdefiniowano std::function: <functional>.

+0

Niestety, był to fragment, nagłówki I zawarte są "#include #include #include #include " –