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

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,在这里您只能使用elaborated-type-specifier,并且必须声明一个单独的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;

关于c++ - 如何使这些typedef工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26297081/

10-12 17:58