我有以下代码段.
template< typename T >
struct f
{
template< typename V >
struct a : f
{};
};
int main ()
{
f<int>::a<int>::a<double> x;
}
Run Code Online (Sandbox Code Playgroud)
它在GCC 4.4.5以及MSVC 2010上没有警告编译,但在GCC 4.5.2上没有 - 我得到以下错误:
test.cc: In function 'int main()':
test.cc:11:21: error: expected primary-expression before 'double'
test.cc:11:21: error: expected ';' before 'double'
Run Code Online (Sandbox Code Playgroud)
因此,虽然我没有看到任何关于它的非标准问题,但问题是强制性的 - 这在C++中是否合法?此外,如果是,我如何在GCC提交错误报告?(:
编辑:好奇的一点背景:
这应该是一块模板元编程.f基本上具有apply替换的模板元函数类的结构a(当然嵌套type的apply被省略,所以我们可以专注于结构本身).
在这种情况下,继承是用于绑定元函数返回值的标准设备.这个代码片段试图实现的是一个元函数类,在计算时递归地自我产生.
edit2:让我有点不同的相同片段:
template< typename T >
struct f
{
template< typename V > struct a;
};
template< typename T >
template< typename V >
struct f<T>::a : f<T>
{};
int main ()
{
f<int>::a<int>::a<double> x;
}
Run Code Online (Sandbox Code Playgroud)
这会产生相同的错误.我认为它驳斥了不完整的类型参数.
现有答案中有一些很好的注释。首先,f的类型在定义嵌套类模板时不完整,但它f是一个依赖类型。现在,如果实例化嵌套模板 ( f),它将实例化嵌套模板(成员)的声明。请注意,成员的声明不包括基本子句列表,因此不需要完整的基类。一旦嵌套模板被隐式实例化,f就完成了,当涉及到实例化成员的定义时,应该不再有问题了。所以我认为科莫在这里抱怨是不正确的。
另一个错误是,事实上,f<int>::a<int>::a正在命名 的构造函数a<int>,并要求它是构造函数模板(作为<int>模板参数)。这是DR #147的基础。
当限定符名称不是注入类名的类时,不会完成对构造函数的转换。例如,如果它是派生类,您的代码将变得有效(正如一些答案所得出的那样)。
| 归档时间: |
|
| 查看次数: |
824 次 |
| 最近记录: |