mardi 7 juillet 2020

Templated ostream operator << for multiple types within a namespace

I have a namespace with several structs and enum classes inside of it. For each type, I have a toString() method. Here is a small example:

namespace test {
    struct A {
       int i;
    };

    struct B {
       float j;
    };

    std::string toString(const A &a){
        return to_string(a.i);
    }

    std::string toString(const B &b){
        return to_string(b.j);
    }
}

I want to provide a templated operator<< which captures only these types, but not for types outside of this namespace:

template<class T>
std::ostream & operator<<(std::ostream &out, const T &t){
    out << toString(t);
    return out;
}

However, this gives me the following compilation error:

error: ambiguous overload for 'operator<<' (operand types are 'std::stringstream {aka std::__cxx11:basic_stringstream<char>}' and 'const char*')

How can I write a templated operator overload for this?

Aucun commentaire:

Enregistrer un commentaire