gpt4 book ai didi

c++ - 递归嵌套模板——gcc 错误?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:28:58 25 4
gpt4 key购买 nike

我有以下片段。

template< typename T >
struct f
{
template< typename V >
struct a : f
{};
};

int main ()
{
f<int>::a<int>::a<double> x;
}

它在 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'

所以虽然我没有看到任何关于它的非标准,但问题是强制性的——这在 C++ 中合法吗?另外,如果是,我如何在 GCC 提交错误报告? (:

编辑:好奇的小背景:

这应该是一段模板元编程。 f 基本上具有模板元函数类的结构,其中 apply 代替了 a(当然嵌套的 type apply 被省略了,所以我们可以专注于结构本身)。

在这种情况下,继承是绑定(bind)元函数返回值的标准设备。这段代码试图实现的是一个元函数类,它在求值时递归地产生自己。

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;
}

这会产生相同的错误。我认为它反驳了不完整的类型参数。

最佳答案

现有答案中有一些很好的注释。一、f定义嵌套类模板时的类型不完整,但是 f是依赖类型。现在,如果您实例化嵌套模板 ( f ),它将实例化嵌套模板(成员)的声明。请注意,成员的声明不包括基子句列表,因此不需要完整的基类。一旦嵌套模板被隐式实例化,f是完整的,当涉及到实例化成员的定义时,应该没有问题了。所以我认为 comeau 在这里提示是不正确的。

另一个错误是,事实上,f<int>::a<int>::a正在命名 a<int> 的构造函数, 并要求它是构造函数模板(<int> 是模板参数)。它的基础是 DR #147 .

当限定符名称不是注入(inject)类名称的类时,不会完成对构造函数的转换。例如,如果它是派生类,则您的代码将变得有效(正如一些答案所指出的那样)。

关于c++ - 递归嵌套模板——gcc 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5851619/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com