gpt4 book ai didi

c++ - 类模板中的 Typedef 评估

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:42:26 27 4
gpt4 key购买 nike

以下代码使用 g++ 编译,但使用 clang 编译失败。

struct X;

template <typename T>
struct Traits
{
typedef typename Traits<T>::Container Container;
};

template <>
struct Traits<X>
{
typedef std::vector<X *> Container;
};

int main()
{
Traits<X>::Container container;
return EXIT_SUCCESS;
}

clang 错误信息:

main.cpp:9:30: error: no type named 'Container' in 'Traits<T>'

编译器是否应该在不将模板参数替换为实际类型的情况下评估 typedef?哪个编译器是正确的?

clang :http://coliru.stacked-crooked.com/a/fef7725827074e4f

海湾合作委员会:http://coliru.stacked-crooked.com/a/79e17031fcabcd83

最佳答案

template <typename T>
struct Traits {
typedef typename Traits<T>::Container Container;
};

这是错误的格式,不需要诊断。没有 T 使得上述(主要)特化可以产生有效代码。

另一个专业的存在没有区别。编译器可以自由地做任何事情,包括给出虚假的错误信息。编译它是免费的。仅当您在程序的其他地方有一个名为 foo 的变量,或者如果月亮是新的时,才可以免费生成错误。有些是实现质量差。

在实践中,这意味着编译器可以自由地假设主要特化对某些类型 T 有效(即,其中没有无限递归),并且在相对不相关的代码中乱码,因为它做出了这个假设。

关于c++ - 类模板中的 Typedef 评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43262979/

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