我怎样才能使这些typedef工作

How can I make these typedefs work?

本文关键字:typedef 工作      更新时间:2023-10-16

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

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' : redefinition; different basic types

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

将某些东西同时声明为一个类和另一个类的typedef是不正确的。尽管类名和typedef名称在许多上下文中是可互换的,但它们并不总是可以互换的,例如,当类型是一个类时,可以将其称为Aliceclass Alice(使用所谓的精化类型说明符),但如果Alice是typedef名,则这是无效的。该规则源自C,在C中,只能使用详细的类型说明符,并且必须声明一个单独的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;

您可以使用继承作为一种可能的解决方法:

class Alice;
Alice* a1;
template<typename T>
class Bob {};
class Alice : public Bob<int> {} ;

如果我认为这是正确的,并且存在语句

Alice obj;

编译器将如何解释"爱丽丝"。在符号表中有两个条目:一个作为类,另一个作为模板。

这就是它出错的原因。