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绝对正确。