c++ - 带有运算符语法的错误消息,但不是带有函数语法的错误消息

标签 c++ templates

为什么我在调用一元时收到错误消息 +使用运算符语法?如果我用函数语法调用它,就可以了。 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/

相关文章:

c++ - FileServer 可以避免高 CPU 使用率吗?

c++ - 返回 const auto 对象——和 Qt 隐式共享

c++ - 线程不断运行并执行命令

c++ - 模板类型推导中的隐式转换

c++ - iPhone编译移植代码问题: calling a static templated function that's inside a templated class == fail

c++ - boost::asio::ip::tcp::resolver::iterator 检查值是否为空

c++ - 将静态库链接到dll

c++ - C++调用显式模板构造函数

c# - 如何在 C# 中将 System.IO.BinaryWriter 与模板/泛型类型的数组一起使用?

java - eclipse 中的字符串