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

visual Template argument name collision with method in MSVC C++

本文关键字:C++ 方法 冲突 MSVC 参数 可视      更新时间:2023-10-16

以下代码片段无法在 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++编译器对代码没有问题。

将基类声明中的模板参数 Type 重命名为其他名称(不与基类的任何方法冲突)可以解决此问题。添加类似: (typename Type)(type)的东西无济于事。

这是MSVC C++编译器的错误吗?解决此类问题的任何技巧?

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

实例化点存在这样一个成员的事实不应干扰。当模板正确实现时,它不会,正如您在 GCC 中指出的那样。

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