无法在C ++中连接字符串?

时间:2017-09-21 09:23:55

标签: c++ string function operators concat

我有一个使用以下定义记录的方法:

void log(std::string s) {
    std::string tag = "main";
    std::cout << tag << " :" << s << std::endl;
}

我试图像这样调用这个方法:

log("direction" << std::to_string(direction) << ", count: " << std::to_string(count));

directioncount是整数。

我收到以下错误,<<以红色下划线标出:

  

没有运营商&lt;&lt;匹配这些操作数。   操作数类型是const char [10]&lt;&lt;的std :: string

我的标题中有#include<string>,以确保我的字符串正常运行。

我尝试了std::string("direction")但问题仍然存在。

C ++初学者。帮助将不胜感激。

5 个答案:

答案 0 :(得分:2)

function selectAll(){ $rootScope.$broadcast("SelectAll"); } 运算符替换<<,因为您正在操作字符串,而不是流:

+

答案 1 :(得分:2)

operator<<不用于任意字符串连接 - 它被称为“输出流操作符”,它仅在std::ostream的上下文中使用。

当你说...

std::cout << tag << " :" << s << std::endl;

...你实际上编写的代码大致相当于:

std::cout.operator<<(tag).operator<<(" :").operator<<(s).operator<<(std::endl);

正如您所看到的,operator<<知道如何使用std::coutstd::string,但不知道如何使用字符串。

为了连接std::string个实例,您只需使用operator+

log("direction" + std::to_string(direction) + ", count: " + std::to_string(count));

请注意,这种串联技术效率最高:您可能需要查看std::stringstream或仅使用std::string::reserve来避免不必要的内存分配。

答案 2 :(得分:0)

如果您决定使用operator<<符号,则需要一个能够理解它的对象。

这是一个对象(我没有声称这是一个好主意):

#include <string>
#include <sstream>
#include <iostream>

void log(std::string s) {
    std::string tag = "main";
    std::cout << tag << " :" << s << std::endl;
}

struct string_accumulator
{
    std::ostringstream ss;

    template<class T>
    friend string_accumulator& operator<<(string_accumulator& sa, T const& value)
    {
        sa.ss << value;
        return sa;
    }

    template<class T>
    friend string_accumulator& operator<<(string_accumulator&& sa, T const& value)
    {
        return operator<<(sa, value);
    }

    operator std::string () { return ss.str(); }
};

inline auto collect() -> string_accumulator
{
    return string_accumulator();
}

int main()
{
    int direction = 1;
    int count = 1;
    log(collect() << "direction" << std::to_string(direction) << ", count: " << std::to_string(count));
}

答案 3 :(得分:0)

您的函数原型是void log(std::string s);。等待std::string。所以你需要传递一个字符串,而不是一个流!

所以,改变一下:

log("direction" << std::to_string(direction) << ", count: " << std::to_string(count));

到此:

log("direction" + std::to_string(direction) + ", count: " + std::to_string(count));

我只将<<运算符更改为+运算符。它现在将括号内的所有内容连接到单个std::string

您的尝试意味着您希望将std::ostream作为参数传递。也许你想阅读C++ Passing ostream as parameter。但是,如果我是你,我会重载<<

答案 4 :(得分:-2)

为什么不使用:  //只需包含此using namespace std;