我怎样才能使这些typedef工作
How can I make these typedefs work?
这些行位于不同的头文件中,最终按以下顺序包含在源文件中:
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名称在许多上下文中是可互换的,但它们并不总是可以互换的,例如,当类型是一个类时,可以将其称为Alice
或class Alice
(使用所谓的精化类型说明符),但如果Alice
是typedef名,则这是无效的。该规则源自C,在C中,只能使用详细的类型说明符,并且必须声明一个单独的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;
您可以使用继承作为一种可能的解决方法:
class Alice;
Alice* a1;
template<typename T>
class Bob {};
class Alice : public Bob<int> {} ;
如果我认为这是正确的,并且存在语句
Alice obj;
编译器将如何解释"爱丽丝"。在符号表中有两个条目:一个作为类,另一个作为模板。
这就是它出错的原因。
相关文章:
- C++:TypeDef使用元组
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 程序编译和运行,但一段时间后,它停止使用Typedef关键字在CPP上工作
- typedef 枚举无法C++工作
- STL代码typedef类型名value_type,size_type等如何工作
- "Typedef redefinition with different types" Clang中关于工作MSVC代码的错误
- 我怎样才能使这些typedef工作
- typedef如何为函数指针工作
- typedef如何代替Procedure c++的struct/class工作
- 不可能启用/禁用带有sfinae的typedef.工作区
- c++模板类型在typedef工作的地方中断
- 这个 typedef 语法是如何工作的..