嘿,伙计们.我正在从一个主要在MSVS中开发的项目中移植一些代码来使用g ++.我发现了很多小的差异,主要是MSVS允许的东西,但g ++没有.通常它涉及c ++标准,MSVS允许滑动的东西,但我很难看到一个特定部分的错误.
g ++在调用operator!=时遇到问题,但仅限于特定的上下文.如果托管类不是模板,则查找operator!=对于特定的嵌套类.但是,如果我将托管类转换为类模板,则一切都会中断.我要么缺少c ++的基本功能,要么g ++做错了.
我学会了不要哭"Compiler Bug!" 太常见了,所以我想看看这里是否有人能看到我所缺少的东西.
这个工作示例显示了工作的非模板版本,然后是损坏的模板版本.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
Run Code Online (Sandbox Code Playgroud)
破碎的版本与模板
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
Run Code Online (Sandbox Code Playgroud)
模板版本失败并显示错误:
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]()’
Run Code Online (Sandbox Code Playgroud)
这既不适用于msvc也不适用于gcc.
问题是在host<T>::iterator
,T
是在非抵扣范围内.由于两个参数都不允许T
推导,因此无法实例化函数模板.
这就是为什么你通常在类中定义重载的运算符.
struct iterator
{
friend bool operator != (iterator const & lhs, iterator const & rhs)
{
return false;
}
};
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
310 次 |
最近记录: |