gpt4 book ai didi

c++ - typedef更改含义

转载 作者:行者123 更新时间:2023-12-01 14:57:04 25 4
gpt4 key购买 nike

当我使用g++编译以下代码段时

template<class T>
class A
{};

template<class T>
class B
{
public:
typedef A<T> A;
};

编译器告诉我
error: declaration of ‘typedef class A<T> B<T>::A’
error: changes meaning of ‘A’ from ‘class A<T>’

另一方面,如果我将 typedef更改为
typedef ::A<T> A;

一切都可以使用 g++进行编译。 Clang++ 3.1不在乎这两种方式。

为什么会这样呢?第二行为标准是吗?

最佳答案

g++是正确的并且符合标准。从[3.3.7 / 1]起:

A name N used in a class S shall refer to the same declaration in its context and when re-evaluated in the completed scope of S. No diagnostic is required for a violation of this rule.



在typedef之前, A指的是 ::A,但是现在通过使用typedef,您可以使 A指代被禁止的typedef。但是,由于 no diagnostic is required,clang也符合标准。

jogojapan's comment解释了此规则的原因。
对您的代码进行以下更改:
template<class T>
class A
{};

template<class T>
class B
{
public:
A a; // <-- What "A" is this referring to?
typedef A<T> A;
};

由于类作用域的工作方式, A a;变得模棱两可。

关于c++ - typedef更改含义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63643823/

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