gpt4 book ai didi

c++ - g++ 另一个在 msvs 中工作的东西的编译错误

转载 作者:搜寻专家 更新时间:2023-10-31 00:48:55 26 4
gpt4 key购买 nike

大家好。我正在从一个主要在 MSVS 中开发的项目中移植一些代码以使用 g++。我发现了很多细微差别,主要是 MSVS 允许但 g++ 不允许的东西。通常它涉及 c++ 标准,MSVS 允许滑动的东西,但我无法看到某个特定部分的问题。

g++ 在匹配对运算符 != 的调用时遇到问题,但仅限于特定上下文。如果宿主类不是模板,则查找特定嵌套类的运算符 != 有效。但是,如果我将托管类转换为类模板,一切都会崩溃。我要么缺少 c++ 的基础知识,要么 g++ 做错了什么。

我学会了不喊“编译器错误!”太频繁了,所以我想看看这里是否有人能看到我遗漏的东西。

这个工作示例显示了工作的非模板版本,然后是损坏的模板版本。g++ --version 给出:g++ (Ubuntu 4.4.1-4ubuntu9) 4.4.1

没有模板的工作引用版本

namespace Works {

struct host {
struct iterator {};
iterator op();
};

bool operator != (host::iterator const& a0, host::iterator const& a1);

bool f() {
return host().op() != host().op();
}

} // namespace Works

带有模板的损坏版本

namespace Broken {

template <typename T>
struct host {
struct iterator {};
iterator op();
};

template <typename T>
bool operator != (typename host<T>::iterator const& a0,
typename host<T>::iterator const& a1);

bool f() {
return host<int>().op() != host<int>().op();
}

} // namespace Broken

模板版本因错误而失败:

Main.cpp: In function ‘bool Broken::f()’:
Main.cpp:50: error: no match for ‘operator!=’ in ‘Broken::host<int>().Broken::host<T>::op [with T = int]() != Broken::host<int>().Broken::host<T>::op [with T = int]()’

最佳答案

这在 msvc 和 gcc 中都不起作用。

问题是在host<T>::iterator , T处于不可推导的上下文中。由于两个参数都不允许 T推导出函数模板无法实例化。

这就是您通常在类中定义重载运算符的原因。

struct iterator
{
friend bool operator != (iterator const & lhs, iterator const & rhs)
{
return false;
}
};

关于c++ - g++ 另一个在 msvs 中工作的东西的编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2180297/

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