由于模板实例化导致的意外类型

时间:2015-10-10 18:51:20

标签: c++ templates instantiation type-inference

我有以下(简化)代码:

   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 ++标准?如果是这样,它是故意的吗?

1 个答案:

答案 0 :(得分:1)

没有类型更改:MySpecialTypeint的类型别名(synonim)。没错:这两个是同一类型。

在您的示例中,mirror_idVarArray<int>::iterator,还有MySpecialType*int*。这些都是相同的类型。

让您感到困惑的是MSVC ++没有调用与您在程序中使用的名称相同的变量类型(这是MSVC ++中应修复的错误)。

据我所知(从评论中)你期望所谓的强大的typedef&#34;,C ++不能直接支持 - 你可以把你的int放在一个结构中,然后转发所有必要的操作。

class MySpecialType
{
    int wrapped_int;
public:
    MySpecialType(int a) : wrapped_int(a) { }
    explicit operator int() const { return wrapped_int; }
    int get() const { return wrapped_int; }
};