2

次のコードを考える

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 ‘&gt;’ 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’

これは、ここのような「非推定コンテキスト」の場合ですか?

部分的な特殊化で使用されないテンプレート パラメーター

内部クラスが実際にクラスであるという保証はないため、これは理にかなっています (型名であることがわかっているだけで、型定義である可能性があります)。それが実際のクラスであることを指定する方法はありますか?

4

1 に答える 1

2

それでは、それが実際のクラスであることを指定する方法はありますか

いいえ、部分的なテンプレートの特殊化でこのタイプを使用する場合、指定する方法はありません。

2つの方法しかありません。Descコンクリートに特化してAいるので、

template<>
struct Desc<typename A<type>::In> { };

または次のようなものを使用します

template<typename T, typename  = void>
struct Desc{
};


template<typename X>
struct Desc<X, typename A<X>::In> {
};

A<X>またはもちろん、ではなくタイプに特化しA<X>::Inます。

于 2012-08-23T11:59:14.393 に答える