gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 17:39:57 25 4
gpt4 key购买 nike

以下代码片段无法在 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 中提到的那样,当模板被正确实现时,它不会。

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

关于c++ - 模板参数名称与 MSVC C++ 中的方法发生冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46662374/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com