如何使这些typedef工作?

时间:2014-10-10 10:15:43

标签: c++

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

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

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

3 个答案:

答案 0 :(得分:3)

将一些东西既作为一个类又作为另一个类的typedef声明它是不正确的。虽然类名和typedef名在许多情况下是可以互换的,但它们并不总是如此,例如当它是一个类时,可以将类型称为Aliceclass 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个条目:一个作为类,另一个作为模板。

这就是它给出错误的原因。