ゲームが作れるようになるまでがんばる日記

ゲーム制作のことを中心にゲームに関することを書いています

インナークラスでテンプレート

あるクラスをテンプレート関数で呼び出して、さらにクラスの中にあるインナークラスをテンプレートで呼び出そうとして、ちょっとハマった。
テンプレート関数のなかでさらにインナークラスを呼び出すときには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>();
}