Reputation: 15284
Can I overload existing function/operator in existing class?
I was trying to do:
#include <iostream>
#include <string>
using namespace std;
string& string::operator<<(const string& str) {
this->append(str);
}
But this gives me error:
test.cpp:5: error: too few template-parameter-lists
How can I do this? Or I can't?
Upvotes: 4
Views: 24346
Reputation: 867
Use
std::ostringstream
#include <sstream>
#include <iostream>
using namespace std;
int main()
{
std::ostringstream ss;
ss << "Hello" << " " << "world";
std::string s = ss.str();
ss.str(std::string());
cout << s << endl;
return 0;
}
https://onlinegdb.com/rkanzeniI
Upvotes: 0
Reputation: 70402
I defer to Benjamin's answer for creating a stream-like interface on a string
object. However, you could use a stringstream
instead.
#include <sstream>
std::istringstream ss;
ss << anything_you_want;
std::string s = ss.str(); // get the resulting string
ss.str(std::string()); // clear the string buffer in the stringstream.
This gives you the stream-like interface you want on a string
without needing to define a new function.
This technique can be used generally to extend the functionality of a string
. That is, defining a wrapper class that provides the extended functionality, and the wrapper class also provides access to the underlying string
.
Upvotes: 0
Reputation: 103703
You can't add member functions to a class unless you modify that class' definition. Use a free function instead:
string& operator<<(string & lhs, const string & rhs) {
return lhs += rhs;
}
Upvotes: 8