首页 > 解决方案 > 如何在使用时不知道类型的情况下为输入/输出编写 C++ 运算符重载

问题描述

我做了一个运算符:

template <typename Container>
std::ostream& operator << (std::ostream& out, const Container& container) {
string result = "{";

out << result;

return out;
}

当我想使用它时:

enum class space { empty, full, half };
using elements_t = vector<space>;

int main(int argc, char** argv)
{
    elements_t elems = { space::half };
    cout << elems;
    return 0;
}

它抛出一个错误:

'operator <<' 是模棱两可的。

您如何指定要使用自定义的?我知道使用模板函数之后,您会在 <> 中分配类型,如果我有一个特定的类/结构,我可以使运算符成为本地或朋友,但如果我希望它是全局的怎么办?

标签: c++operator-keyword

解决方案


如果我尝试您的程序,编译器会抱怨您的自定义运算符定义operator<<() 内部(最好复制包括行号在内的确切错误消息)。我想你想在std::operator<<这里使用(重复会导致无限递归)。为此,您可以这样写:

template <typename Container>
std::ostream& operator << (std::ostream& out, const Container& container) {
    std::string result = "{";

    std::operator<<(out, result);
    return out;
}


推荐阅读