[英]Why cannot I define a unary operator and then declare a friend binary operator with same name in a template class in MSVC?
考虑这样的代码:
template<typename S>
class C;
template<typename S>
C<S> operator-(C<S> lhs, C<S> rhs);
template<typename S>
class C
{
public:
C operator-() { return *this; }
friend C operator-<S>(C lhs, C rhs);//error on this line
};
template<typename S>
C<S> operator-(C<S> lhs, C<S> rhs) { return C<S>(); }
int main(int argc, char** argv)
{
C<int> a,b;
a-b;
return 0;
}
这给了我MSVC 6错误。 但是,如果在朋友声明之后移动C operator-()
的定义,它将进行编译。 如果将类更改为未模板化的类,则会进行编译。 这似乎也可以在g ++中编译。 (基于https://wandbox.org/我没有安装g ++)
那这怎么了?
我在这里找到了一些有用的信息数据。 问题是成员运算符一元减号隐藏了全局二进制减法。 所以我必须与
friend C<S> (::operator-<S>)(C<S> lhs, C<S> rhs);
明确要求在全局范围内使用operator-:在c ++名称中,在类型检查之前进行查找。
此外,由于朋友不是类的一部分(我想是原因),因此必须在返回类型和参数类型之后编写模板参数。 没有它们(例如, friend C (::operator-<S>)(C lhs, C rhs);
),它们仍然可以在MSVC中工作,但不适用于g ++。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.