我已經瀏覽了幾個主題上的問題,但它沒有幫助,如果重複則很抱歉。嵌套說明符中使用的模板不完整類型
爲什麼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