あるクラスをテンプレート関数で呼び出して、さらにクラスの中にあるインナークラスをテンプレートで呼び出そうとして、ちょっとハマった。
テンプレート関数のなかでさらにインナークラスを呼び出すときにはtypenameが必要となる。これに気が付かずビルドエラーになってしまって、ただしくコンパイルできるまで時間がかかってしまった。
#include <iostream> using namespace std; class ClassA { public: static void Func() { cout << "funcA" << endl; } class ClassB { public: static void Func() { cout << "funcB" << endl; } }; }; template <class T> void TestA() { T::Func(); } template <class T> void TestB() { TestA<typename T::ClassB>(); // typenameが必要。TestA<T::ClassB>()ではビルドエラー } int main(void){ TestA<ClassA>(); TestB<ClassA>(); }