Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 馈送到std::stringstream,同时将其作为参数传递给函数c++;_C++_String_Stringstream_Ostream_Temporary - Fatal编程技术网

C++ 馈送到std::stringstream,同时将其作为参数传递给函数c++;

C++ 馈送到std::stringstream,同时将其作为参数传递给函数c++;,c++,string,stringstream,ostream,temporary,C++,String,Stringstream,Ostream,Temporary,我有以下功能 void Assembly::push_back(stringstream& ss){ instructions->push_back(ss.str()); } std::ostream& pad(std::ostream& os) { return os <<"\t"<<std::left<< std::setfill(' ') << std::setw(8); } 但是我从编译器那

我有以下功能

void Assembly::push_back(stringstream& ss){
    instructions->push_back(ss.str());
}

std::ostream& pad(std::ostream& os) {
    return os <<"\t"<<std::left<< std::setfill(' ') << std::setw(8);
}
但是我从编译器那里得到一个错误

no known conversion for argument 1 from 'std::basic_ostream<char>' to 'std::stringstream& {aka std::basic_stringstream<char>&}'
工作正常,但需要两行代码才能进行正确的调用)。我也愿意接受使
操作符过载的解决方案,使您的
pad()
获取并返回
std::stringstream
,然后还添加以下内容:

template <typename T>
std::stringstream &
operator<<(std::stringstream &ss, const T &o) {
    static_cast<std::ostream &>(ss) << o; // Prevent recursion.
    return ss;
}
模板
std::stringstream&

操作员我认为问题出在这里。这将不起作用,因为
ss的返回值为什么不生成一些简单的
指令
类来进行格式化,并有各种构造函数(或潜在的子类)来处理必要的参数组合?为什么将
push_back
调用放在一行上是“必要的”?是的,创建一个单独的类是可行的,只是想知道我是否可以使用标准库来实现它。我想在一行中调用
push_
,因为我连续多次调用它,这使得代码看起来非常混乱。我尝试了
push_-back(const std::stringstream&ss),它不起作用
Assembly outfile;
stringstream ss;
ss<<pad<<"addiu"<<"$sp, $sp, -8";
outfile.push_back(ss);
template <typename T>
std::stringstream &
operator<<(std::stringstream &ss, const T &o) {
    static_cast<std::ostream &>(ss) << o; // Prevent recursion.
    return ss;
}
void push_back(const std::stringstream& ss)
{
    std::cout << "push: " << ss.str() << '\n';
}

int main(int, char* argv[])
{
    std::stringstream ss;

    // what gets sent to the function is an std::ostream&
    // which is an incompatible type.
    push_back(ss << "one " << 2 << ' ' << 3.0); // fail
}
template<typename DataType>
std::stringstream& operator<<(std::stringstream& ss, const DataType& data)
{
    static_cast<std::ostream&>(ss) << data;
    return ss;
}
void push_back(const std::stringstream& ss)
{
    std::cout << "push: " << ss.str() << '\n';
}

int main(int, char* argv[])
{
    std::stringstream ss;

    // Now the << returns the correct type (std::stringstream&)
    push_back(ss << "one " << 2 << ' ' << 3.0); // good
}