トピックに関するいくつかの質問を見てきましたが、重複してもご迷惑をかけませんでした。ネストされた指定子で使用されるテンプレート不完全型
なぜInner
は不完全なタイプですか?循環依存はどこにありますか?
P.S. (注へ
template<typename Type>
struct Inner<Type, typename std::enable_if<std::is_same<int, Type>::value>::type>
{ static void inner() { std::cout << "enabled\n"; } };
そしてcall_inner
- NOT_USED
は、私が(>is_same<int, Type>
NOT_USED->Type
、is_same<int, A>
)に2つ目の特化を変更した場合
template <class A>
struct Outer
{
template <class NOT_USED, class Enabled = void>
struct Inner
{ static void inner() { std::cout << "not enabled\n"; } };
template <class NOT_USED>
struct Inner<NOT_USED, typename std::enable_if<std::is_same<int, A>::value>::type>
{ static void inner() { std::cout << "enabled\n"; } };
};
template <class A>
void call_inner(A& a)
{
Outer<A>::template Inner<void>::inner(); // #1
}
int main()
{
int intVar = 10;
double doubleVar = 1;
call_inner(intVar); // OK
call_inner(doubleVar); // Error at #1: incomplete type ‘Outer<double>::Inner<void>’ used in nested name specifier
}
UPDATE
部分特殊化を維持するためにプレースホルダークラスですInner<void>
- >Inner<T>
)
template <class T>
void call_inner(T& t)
{
Outer<T>::template Inner<T>::inner();
}
すべてコンパイルされます。何故ですか?どうやら、Outer
テンプレートパラメータの依存関係は、どうにかしてインスタンス化プロセスを変更しますか?
SFINAEはここに適用されないのはなぜ?更新された質問を参照してください。 'Inner'インスタンス化の違いは何ですか? – DimG