【发布时间】:2015-10-10 18:51:19
【问题描述】:
我有以下(简化的)代码:
template<typename T>
class VarArray
{
typedef T* iterator;
};
void get_setpoints()
{
VarArray<int>::iterator mirror_id;
int id;
*mirror_id = id;
}
*mirror_id 的类型是int。到现在为止还挺好。
现在我要在中间添加2个完全不相关的typedef:
template<typename T>
class VarArray
{
typedef T* iterator;
};
typedef int MySpecialType;
typedef VarArray<MySpecialType> bool_t;
void get_setpoints()
{
VarArray<int>::iterator mirror_id;
int id;
*mirror_id = id;
}
由于这些额外的 typedef,*mirror_id 的类型突然变成了MySpecialType,而我真的希望它是int 的类型。至少 Microsoft Visual Studio C++ 编译器和 EDG C++ 编译器似乎是这种情况。
我认为这很可怕的原因是一些嵌套的未知包含文件可能会突然将变量的类型更改为其他类型。你不知道它,如果你知道,就很难弄清楚它来自哪里。
所以我的问题是,这种行为是否符合 C++ 标准?如果是这样,是故意的吗?
【问题讨论】:
-
你的例子有点奇怪,
MySpecialType只是int的别名 (typedef) - 这意味着两者是等价的(它们都表示键入int)。你到底在害怕什么? -
我认为它不会将您的类型更改为其他类型。您的
int将保留int。你如何检查你的类型? -
@FilipRoséen-refp。可能这有点特殊。我想编写一个禁止从“MySpecialType”转换到“MySpecialType”的编码标准规则。现在我得到一个误报“*mirror_id = id;”因为 EDG 认为它将“int”转换为“MySpecialType”。
-
@Rotislav。如果我不小心输入了“*mirror_id = &id;”,Visual Studio 编译器会显示“错误 C2440:'=':无法从 'int *' 转换为 'MySpecialType'”。真的很奇怪。
标签: c++ templates instantiation type-inference