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

Fre*_*nix 8 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);
Run Code Online (Sandbox Code Playgroud)

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

重命名模板参数在Base类声明中输入不同的东西(不与任何基类方法冲突)解决了这个问题.添加类似的东西 : (typename Type)(type)没有帮助.

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

Sto*_*ica 9

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

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

但微软直到最近才正确实施.在它们的实现中,模板的行为更像宏,这是导致错误的原因.