我想这样做:
MyClass mc = MyClass("Some string" << anotherString);
感谢您的回答,我决定根据您告诉我的内容重新撰写此问题,因为它有点混乱。最后,我读了C++ format macro / inline ostringstream,并决定使用宏,因为使用构造函数实际上不可能这样做。一些答案我不再相关。
现在,我能做的是:
MY_CLASS("Some string" << anotherString << " more string!");
使用此宏:
#include <sstream>
#define MY_CLASS(stream) \
MyClass( ( dynamic_cast<std::ostringstream &> ( \
std::ostringstream() . seekp( 0, std::ios_base::cur ) << stream ) \
) . str() )
MyClass构造函数采用字符串:
MyClass::MyClass(string s) { /* ... */ }
答案 0 :(得分:4)
重新设计您的解决方案。如果你的c-tor需要字符串,它应该接受字符串 如果你的构造函数接受const引用,那么在这个和类似的情况下会更好。
no matching function for call to ‘MyClass(std::basic_ostream <..>&)
发生错误,因为运营商&lt;&lt;为std :: basic_ostream定义并返回std :: stringstream对象。当然你可以使用
dynamic_cast< const std::stringstream& >( s << "hello" << "world" )
但是你的团队负责人可以解雇你这段代码:)
BTW:
MyClass mc = MyClass("Some string" << anotherString);
可以重写为
MyClass mc("Some string" << anotherString);
答案 1 :(得分:2)
您的编译错误看起来已包含
<iosfwd>
在你班级的头文件中,但你没有包括
<sstream>
在cxx文件中。
答案 2 :(得分:1)
我认为您应该查看this问题,了解获得所需行为所需的一些提示。
这种事情似乎有点困难。
答案 3 :(得分:1)
&lt;&lt; operator返回一个ostream&amp;而不是streamstream&amp ;,所以你必须进行动态转换:
MyClass::MyClass(ostream &stream)
{
string myString = dynamic_cast<stringstream &>(stream.str());
}
stringstream s;
MyClass *mc = new MyClass(s << "Some string" << anotherString);
但真的这是一件可怕的事情。尝试这样的事情:
class Streamer
{
stringstream stream;
public:
template <class T>
Streamer &operator <<(const T &object) { stream << object; return *this;}
operator string() { return stream.str(); }
};
class MyClass
{
public:
MyClass(const string &s) : MyString(s) {}
string MyString;
};
int main()
{
MyClass myClass(Streamer() << "something" << "world");
cout << myClass.MyString;
}