テンプレートのインライン展開時におけるシンボル解決
次のようなコードを考えます。
1. inline指定されたテンプレート関数func
2. funcを通してクラスBのメンバにアクセスするクラスA
3. クラスBの実装はクラスAより後にある
template<class T>
inline func()
{
cout << T::GetClassName() << endl;
}
class B;
class A {
void Run(){
func<B>();
//::B::GetClassName(); error
}
};
class B {
public:
static string GetClassName(){
return "B";
}
};
この場合、
インライン展開されたテンプレート関数は、シンボルGetClassNameを解決するため、クラスBの完全な型情報が必要だと思うのですが、C++11の規格ではどうなってるでしょうか?
ちなみにgcc4.8で試したところ、上記のコードはコンパイルが通りましたが、コメントアウト箇所を有効にしたところ、完全な型情報を求められコンパイルエラーになりました。