这些行位于不同的头文件中,最终按以下顺序包含在源文件中:
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
为什么这是一个错误? 有什么方法可以解决它吗?
答案 0 :(得分:3)
将一些东西既作为一个类又作为另一个类的typedef声明它是不正确的。虽然类名和typedef名在许多情况下是可以互换的,但它们并不总是如此,例如当它是一个类时,可以将类型称为Alice
或class Alice
(使用所谓的 elaborated-type-specifier ),但这不是如果Alice
是typedef名称,则有效。该规则源自C,您只能 使用elaborated-type-specifier,并且必须声明一个单独的typedef才能简单地说Alice
。
差异很重要,因为该类型具有用于链接目的的名称&#34;这是用于名称修改的名称,它影响链接器看到的符号。
如果一个文件只看到了typedef名称Alice
并将其用于void foo(Alice*)
等函数的错位名称,那么您将无法将该函数与其他对{{1}的引用相关联。即使它们应该具有相同的错位名称。
由于这个原因,编译器必须区分typedef(只是别名)和类型&#34;真名称&#34; (即用于连接目的的名称)。
唯一的解决方法是正确声明类型,以便在任何地方使用void foo(Bob<int>*)
作为typedef的声明,即将不真实的Alice
声明替换为:
class Alice;
答案 1 :(得分:1)
您可以使用继承作为可能的解决方法:
class Alice;
Alice* a1;
template<typename T>
class Bob {};
class Alice : public Bob<int> {} ;
答案 2 :(得分:0)
如果我认为这是正确的并且有陈述
Alice obj;
编译器如何解释“Alice”。在符号表中将有2个条目:一个作为类,另一个作为模板。
这就是它给出错误的原因。