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

C++ 我怎样才能使这些typedef工作?,c++,C++,这些行位于不同的头文件中,并最终按以下顺序包含在源文件中: class Alice; /* pointers to Alice declared here!! */ template<class T> class Bob; typedef Bob<int> Alice; template<class T> class Bob { }; VS2013错误C2371:“Alice”:重新定义;不同的基本类型 为什么这是一个错误? 有什么办法可以解决这个问

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

class Alice;

/* pointers to Alice declared here!! */

template<class T>
class Bob;

typedef Bob<int> Alice;

template<class T>
class Bob
{
};
VS2013错误C2371:“Alice”:重新定义;不同的基本类型

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

将某个东西同时声明为类和另一个类的typedef是不正确的。尽管类名和typedef名称在许多上下文中是可互换的,但它们并不总是可互换的,例如,当类型是一个类时,可以使用所谓的详细类型说明符将该类型称为Alice或class Alice,但如果Alice是一个typedef名称,则这是无效的。该规则起源于C,在C中,您只能使用精心设计的类型说明符,并且必须声明一个单独的typedef才能简单地表示Alice

区别很重要,因为类型有一个用于链接目的的名称,即用于名称损坏的名称,这会影响链接器看到的符号

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

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

唯一的解决方法是正确地声明类型,这样Alice作为typedef的声明到处都可以使用,即替换不真实的类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;
编译器将如何解释Alice。在符号表中有两个条目:一个作为类,另一个作为模板


这就是它给出错误的原因

使用不同的名称空间?@这永远是一个建议还是一个问题?第一个Alice是一个类,第二个Alice是一个模板。很可能这就是它抛出错误的原因。我的问题是为什么你需要这种定义。您可以重命名Alice.template类Bob{}中的任何一个;鲍勃·爱丽丝@更清楚的是,为了能够声明Alice typedef,您不需要定义Bob,您只需要声明它。@JonathanWakely绝对正确。