SwiftMango
SwiftMango

Reputation: 15284

C++: string operator overload

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

Answers (3)

Bandula Dharmadasa
Bandula Dharmadasa

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

jxh
jxh

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

Benjamin Lindley
Benjamin Lindley

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

Related Questions