运算符<< 对于 std::string

Operator<< for std::string

本文关键字:lt string std 对于 运算符      更新时间:2023-10-16

我定义运算符<lt;对于std::string对象:

std::string & operator<< (std::string & left, std::string & right){
    return left += right;
}

然后我用它:

        std::string t1("t1"), t2("t2"), t3;
        t3 = t2 << t1;

从编译器获得:

t.cpp: In function 'int main()':
t.cpp:44:28: error: no matching function for call to 'operator<<(std::string&, std::string&)'
t.cpp:44:28: note: candidates are:
In file included from d:mingwbin../lib/gcc/mingw32/4.7.2/include/c++/iostream:40:0,
                 from connection.h:10,
                 from login.cpp:1:
d:mingwbin../lib/gcc/mingw32/4.7.2/include/c++/ostream:600:5: note: template<class _CharT, class _Traits, class _Tp> std::basic_ostream<_CharT
, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&&, const _Tp&)
d:mingwbin../lib/gcc/mingw32/4.7.2/include/c++/ostream:600:5: note:   template argument deduction/substitution failed:
t.cpp:44:28: note:   'std::string {aka std::basic_string<char>}' is not derived from 'std::basic_ostream<_CharT, _Traits>'
In file included from d:mingwbin../lib/gcc/mingw32/4.7.2/include/c++/iostream:40:0,

为什么谈论ostream而不谈论string?即,为什么它没有考虑到我对运算符的定义<lt?

谢谢。

更新。对于那些只能说"为什么要为字符串创建运算符<<?"而不能说任何有用的话的人:

std::string & operator<< (std::string & left, const int num){
    return left += std::to_string(num);
}
 std::string t3;
 t3 << 3 << 5;
 std::cout << t3 << std::endl;

和日志:

t.cpp: In function 'int main()':
t.cpp:45:12: error: no match for 'operator<<' in 't3 << 3'
t.cpp:45:12: note: candidates are:
In file included from d:mingwbin../lib/gcc/mingw32/4.7.2/include/c++/iostream:40:0,
                 from connection.h:10,
                 from login.cpp:1:
d:mingwbin../lib/gcc/mingw32/4.7.2/include/c++/ostream:600:5: note: template<class _CharT, class _Traits, class _Tp> std::basic_ostream<_CharT
, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&&, const _Tp&)
d:mingwbin../lib/gcc/mingw32/4.7.2/include/c++/ostream:600:5: note:   template argument deduction/substitution failed:
t.cpp:45:12: note:   'std::string {aka std::basic_string<char>}' is not derived from 'std::basic_ostream<_CharT, _Traits>'

工作:

#include <iostream>
#include <string>
std::string & operator<< (std::string & left, std::string & right){
    return left += right;
}
int main()
{
    std::string t1("t1"), t2("t2"), t3;
    t3 = t2 << t1;
    std::cout << t3;
}

输出:t2t1[GCC 4.8.1]

正如您自己所说,编译器输出表明您的运算符重载甚至不可见。你不能把申报单放在正确的地方。

无论如何,这不是一个好主意:你只会把阅读你代码的人弄糊涂字符串不是流