gpt4 book ai didi

c++ - 我怎样才能使这些 typedef 工作?

转载 作者:搜寻专家 更新时间:2023-10-31 01:02:55 25 4
gpt4 key购买 nike

这些行位于不同的头文件中,并最终按以下顺序包含在源文件中:

class Alice;

/* pointers to Alice declared here!! */

template<class T>
class Bob;

typedef Bob<int> Alice;

template<class T>
class Bob
{
};

VS2013 error C2371: 'Alice' : 重新定义;不同的基本类型

为什么这是一个错误?有什么办法可以解决吗?

最佳答案

将某物既声明为类又声明为不同类的 typedef 是不正确的。尽管类名称和 typedef 名称在许多上下文中可以互换,但它们并不总是如此,例如可以将类型称为 Aliceclass Alice (使用所谓的 elaborated-type-specifier)当它是一个类时,但如果 Alice 则无效是一个 typedef 名称。该规则起源于 C,在 C 中您只能使用 elaborated-type-specifier 并且必须声明一个单独的 typedef 才能简单地说出 Alice。 .

区别很重要,因为该类型有一个“用于链接目的的名称”,这是用于名称重整的名称,它会影响链接器看到的符号。

如果一个文件只看到 typedef 名称 Alice并将其用于函数的损坏名称,例如 void foo(Alice*)那么您将无法将该函数与对 void foo(Bob<int>*) 的其他引用链接起来即使它们应该具有相同的损坏名称。

因此,编译器有必要区分 typedef(只是别名)和类型的“真实名称”(即用于链接目的的名称)。

唯一的解决方法是正确地声明类型,这样 Alice 的声明因为 typedef 无处不在,即替换不真实的 class Alice;声明:

template<class T> class Bob;
typedef Bob<int> Alice;

关于c++ - 我怎样才能使这些 typedef 工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26297081/

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