typenameキーワード
C++テンプレートテクニック 2-6
テンプレートの曖昧さ回避のために使用するらしい。
#include <iostream> using std::cout; using std::endl; struct ClassA { typedef int result; }; struct ClassB { static const int result = 5; }; int p; template<class T> void func (T) { T::result* p; } int main () { ClassA a; ClassB b; func(a); func(b); return 0; }
このようなケースを考える。
funcにClassAが渡された場合、T::resultはintになるので「int* p」と解釈される。
しかしClassBが渡された場合、おかしなことになる。ClassBのresultは整数の5なので、結果「5* p」と解釈される。
これはつまり、5かけるグローバル変数pと解釈されるのでコンパイルエラーにならない。
そこで、T::resultは型ですよ、と宣言するためにtypenameを使う。
template<class T> void func (T) { typename T::result* p; }
これで晴れてコンパイル時にエラーが出る。
と、本には書いてたのですが、何故か処理が通りました。VC2008だとダメなんだろうか。。。
まぁとにかくそういう話。