我已经浏览了几个主题上的问题,但它没有帮助,如果重复则很抱歉。嵌套说明符中使用的模板不完整类型
为什么Inner
是不完整的类型?循环依赖在哪里?
P.S. NOT_USED
是一个占位符类,以保持专业化部分
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
如果我更改第二个专业化(NOT_USED->Type
,is_same<int, A>
- >is_same<int, Type>
)
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
来(注Inner<void>
→Inner<T>
)
template <class T>
void call_inner(T& t)
{
Outer<T>::template Inner<T>::inner();
}
全部汇编。这是为什么?显然,依靠Outer
模板参数会以某种方式改变实例化过程?
为什么SFINAE在这里不适用?请看最新的问题,'Inner'实例化有什么区别? – DimG