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だとダメなんだろうか。。。

まぁとにかくそういう話。