我有以下问题:
template< typename T, size_t N, size_t... N_i >
struct A
{
// nested class
template< typename... Ts >
class B
{
//...
A<T, N_i...>::B< Ts... > operator[]( size_t i )
{
A< T, N_i...>::B< Ts... > res{ /* ... */ };
return res;
}
// ...
};
};
不幸的是,编译器会产生“A < T, N_i...>::B < Ts... > res{ /* ... */ };
”的错误。有谁知道如何在class B
的函数“class A
”中返回operator[]
的实例化(其外部class B
的模板参数不同)?< / p>
非常感谢提前。
答案 0 :(得分:2)
在完整类型的返回类型之前放置typename
可以修复您获得的错误。但是,不要将模板参数放在B之后,因为B总是引用该类型的“当前”实例化。
#include <stdio.h>
using namespace std;
template< typename T, size_t N, size_t... N_i >
struct A
{
// nested class
template< typename... Ts >
class B
{
//...
typename A<T, N_i...>::B operator[]( size_t i )
{
typename A< T, N_i...>::B res{ /* ... */ };
return res;
}
// ...
};
};
答案 1 :(得分:2)
应该在typename
之前添加A<T, N_i...>
,在template
之前添加B< Ts... >
。
我的意思是
template< typename T, size_t N, size_t... N_i >
struct A
{
// nested class
template< typename... Ts >
class B
{
//...
typename A<T, N_i...>::template B< Ts... > operator[]( size_t i )
{
typename A< T, N_i...>::template B< Ts... > res{ /* ... */ };
return res;
}
// ...
};
}
P.s。:也适用于C ++ 11;不仅仅是C ++ 14