J’ai eu des problèmes (éventuellement le mien) avec les parameters de modèle de modèle et clang. L’exemple de jouet suivant est compilé et exécuté sous g ++ 4.7.0, pas avec Clang ++ 3.0 (basé sur LLVM 3.0), tous deux sous ubuntu 12.04.
Exemple de jouet (test_1.cpp):
#include #include struct AFn { void operator()() { ; // do something } }; template struct impl { T *backpointer_; }; template<typename S, template class T> struct implT { T *backpointer_; }; template class AClass; template struct implT { implT(std::ssortingng message) : message_(message) {} void operator()() { std::cout << " : " << message_ << std::endl; } std::string message_; }; template class AClass { private: std::shared_ptr<implT > p_; public: AClass(std::ssortingng message) : p_(std::make_shared<implT >(message)) {} void call_me() { p_->operator()(); } }; int main(int argc, char **argv) { AClass *A = new AClass("AClass"); A->call_me(); delete A; return 0; }
sortie clang:
*****@ely:~$ clang++ -std=c++11 test_1.cpp -o test_1 test_1.cpp:47:30: error: template argument for template template parameter must be a class template or type alias template std::shared_ptr<implT > p_; ^ test_1.cpp:47:40: error: C++ requires a type specifier for all declarations std::shared_ptr<implT > p_; ^~ test_1.cpp:50:36: error: template argument for template template parameter must be a class template or type alias template p_(std::make_shared<implT >(message)) ^ 3 errors generated. I can't make sense of the first error. It comstacks and runs fine with gcc/g++ 4.7.0. Any help would be appreciated.
Comme indiqué, c’est un bug de Clang. AClass
il existe un nom de classe injecté , une construction grammaticale unique qui est à la fois un nom de classe et un nom de modèle .
Une autre solution consiste à dire AClass::template AClass
. Cela évite de devoir qualifier AClass
avec son espace de noms englobant.
La même chose se passe pour moi avec Clang 3.3.
La solution – ou la solution de contournement – de cette question SO consiste à remplacer AClass
par ::AClass
sur les lignes 47 et 50, et ensuite, la compilation se AClass
sans ::AClass
.
Pour être honnête, les parameters de modèle me font mal à la tête. La question référencée suggère que c’est un bug de Clang, mais je ne suis pas assez expert pour pouvoir le dire.