次のコードを考える
template<typename T>
struct A{
struct In{};
};
template<typename T>
struct Desc{
};
template<typename X>
struct Desc<typename A<X>::In> {
};
int main(){
Desc<A<int>::In> a;
}
コンパイラは Desc 特殊化を拒否します
error: template parameters not used in partial specialization:
error: ‘X’
構造体が定義されている場合も同じ
template<>
template<typename X>
struct Desc<typename A<X>::In> {
};
意味
template<typename X>
template<>
struct Desc<typename A<X>::In> {
};
エラーを与える
desc.cpp:14:10: error: invalid explicit specialization before ‘>’ token
desc.cpp:14:10: error: enclosing class templates are not explicitly specialized
desc.cpp:15:8: error: template parameters not used in partial specialization:
desc.cpp:15:8: error: ‘X’
これは、ここのような「非推定コンテキスト」の場合ですか?
内部クラスが実際にクラスであるという保証はないため、これは理にかなっています (型名であることがわかっているだけで、型定義である可能性があります)。それが実際のクラスであることを指定する方法はありますか?