为什么我在调用一元时收到错误消息 +
使用运算符语法?如果我用函数语法调用它,就可以了。 Live demo .
template <int size>
struct Buffer { char buf[size]; };
template <class T>
struct Wrapper { void operator+() {} };
Wrapper<Buffer<-5>> a;
void f1() { +a; } // error: Buffer<-5>::buf has negative size
void f2() { a.operator+(); } // OK
最佳答案
不合格的查找调用 ADL ,需要知道关联类中是否定义了友元函数。 Buffer<-5>
就是这样,所以它被实例化了。语法上很明显它声明没有 friend 这一事实并没有改变这样一个事实:相同的检查涉及完成类类型,但失败了。
例如,让我们输入 Buffer
进入 namespace N
, 和 operator+
进入 Buffer
.如 a
的类型是 Wrapper<N::Buffer<5>>
( 5
比 -5
更重要), operator+
由 ADL 找到,代码编译( live demo ):
template <class T>
struct Wrapper {};
namespace N {
template <int size>
struct Buffer {
template <class T> friend void operator+(const Wrapper<T>&) {}
char buf[size];
};
}
Wrapper<N::Buffer<5>> a;
void f1() { return +a; }
关于c++ - 带有运算符语法的错误消息,但不是带有函数语法的错误消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62314317/