Я пробовал неявное преобразование, но это не работает.
#include <string>
#include <iostream>
struct MyClass
{
operator std::string() { return "bar"; }
};
int
main( int argc, char* argv[] )
{
MyClass x;
std::cout << std::string( "foo" ) + x << std::endl;
return 0;
}
Неявное преобразование не будет работать, так как строка operator+
является шаблоном, и вы выводите параметры шаблона. Это выглядит как лучшее объяснение того, что происходит: https://stackoverflow.com/a/8892794/964135
Я просто сделал бы бросок или написал бы не шаблон operator+
,
Глупое решение состоит в том, чтобы не выводить типы, и тогда он выполнит неявное преобразование:
std::cout << std::operator+<char, std::char_traits<char>, std::allocator<char> >(std::string( "foo" ), x) << std::endl;
Вы пробовали перегрузить оператор +?
std::string operator+(std::string& str, MyClass& x){
return str + "bar"}
Это будет бесплатная функция, а не часть MyClass. Также может возникнуть необходимость перегрузить коммутативный случай. Вы можете выразить это в терминах вышеупомянутого, если это не имеет значения.
К хорошим ответам, данным Karthik T и Pubby относительно перегруженных operator+()
Я хотел бы добавить один момент.
Обычно вам необходимо получить доступ к частным членам MyClass
внутри перегружен operator+()
код (в отличие от return "bar";
как в вашем предположительно урезанном примере). В этом случае вам нужно будет объявить его как friend
, Вы не можете иметь operator+()
как член MyClass
, поскольку MyClass
приходит на левой стороне оператора +
, Ниже приведен пример кода.
#include <string>
#include <iostream>
using namespace std;
struct MyClass {
public:
MyClass() : bar("bar") {}
friend string operator+(string& str, MyClass& x);
private:
string bar;
};
string operator+(string& str, MyClass& x) {
return str + x.bar;
}
int main( int argc, char* argv[] )
{
MyClass x;
string foo("foo");
std::cout << foo + x << std::endl;
return 0;
}