可视模板参数名称与 MSVC C++中的方法冲突
visual Template argument name collision with method in MSVC 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++编译器对代码没有问题。
将基类声明中的模板参数 Type 重命名为其他名称(不与基类的任何方法冲突)可以解决此问题。添加类似: (typename Type)(type)
的东西无济于事。
这是MSVC C++编译器的错误吗?解决此类问题的任何技巧?
这是 MSVC++ 中的一个错误。两阶段查找需要在模板定义期间将Type
解析为模板参数的名称和基数!
实例化点存在这样一个成员的事实不应干扰。当模板正确实现时,它不会,正如您在 GCC 中指出的那样。
但Microsoft直到最近才正确实施它。在它们的实现中,模板的行为更像宏,这是错误的原因。
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 通过方法访问结构
- 最小硬币更换问题(自上而下方法)
- C++为构建时间获取QDateTime的可靠方法
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 有什么方法可以遍历结构吗
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 使用std::函数映射对象方法
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- C++从另一个类访问公共静态向量的正确方法是什么
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 没有为自己的结构调用列表推回方法
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 在类定义之后定义一个私有方法
- 枚举环境变量的惯用C++14/C++17方法
- 初始化具有非默认构造函数的std::数组项的更好方法