如何使用模板对 const 使用运算符重载

How to use operator overloading for const using templates

我只是为了理解目的而尝试重载 << 运算符。我成功了,但我遇到了 const 数据类型和对象的问题。编译器给我以下内容:

重载运算符“<<”的使用不明确(操作数类型为 'std::__1::ostream'(又名 'basic_ostream')和 'const char')

我在 MAC 和 c++ 17 上使用带有 gcc 的 Clion。有人可以帮助我理解上述错误的含义以及如何修复它。代码如下。谢谢!

template <typename T>
std::ostream& operator<<(std::ostream& ost,  const T data) {
    printf("I am very happy");
    return ost;
}

int main() {

    const char s = 10;

    std::cout << s << std::endl;
}

正如上面的评论所提到的,您不能重载流出的主要类型。它已在标准库中定义。因此,为了打印你的覆盖,你必须发明一些不属于主要类型的用户类型,并流出用户类型。这将直接导致您的超载。

#include <iostream>
template <typename T>
    std::ostream& operator<<(std::ostream& ost,  const T data) {
         printf("I am very happy");
         return ost;
        }
int main() {
    struct mytype{  };
    mytype s;
    std::cout << s << std::endl;
}

此代码将打印您的字符串“我很高兴”。开心点。