模板参数名称与MSVC C ++中的方法冲突

时间:2017-10-10 08:48:58

标签: c++ visual-c++

以下代码段无法在MSVC C ++(2015,2017)中编译:

template <typename Type>
struct Base : public Type
{
    Base(const Type & type)
    : Type(type)
    {}
};

struct SomeType
{
    int Type() { return 42; }
};

struct Wrong : public Base<SomeType>
{
    Wrong(const SomeType & type)
    : Base<SomeType>(type)
    {}
};

SomeType some;
Wrong wrong(some);

编译器很困惑,并解释调用Type构造函数时调用我尝试派生的类Type()方法。 GNU C ++编译器的代码没有问题。

重命名模板参数在Base类声明中输入不同的东西(不与任何基类方法冲突)解决了这个问题。添加: (typename Type)(type)之类的内容无济于事。

这是MSVC C ++编译器的错误吗?解决这些问题的任何提示?

1 个答案:

答案 0 :(得分:9)

这是MSVC ++中的一个错误。在模板定义期间,两阶段查找需要将Type解析为模板参数的名称和基数!

在实例化时有这样一个成员的事实不应该干涉。正确实施模板后,正如您在GCC中所说的那样,它没有。

但是微软没有正确实现它until recently。在它们的实现中,模板的行为更像是宏,这是导致错误的原因。