template template parameters et clang

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.