以下代码段无法在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 ++编译器的错误吗?解决这些问题的任何提示?
答案 0 :(得分:9)
这是MSVC ++中的一个错误。在模板定义期间,两阶段查找需要将Type
解析为模板参数的名称和基数!
在实例化时有这样一个成员的事实不应该干涉。正确实施模板后,正如您在GCC中所说的那样,它没有。
但是微软没有正确实现它until recently。在它们的实现中,模板的行为更像是宏,这是导致错误的原因。