Оператор преобразования для std :: string не работает с присваиванием - PullRequest
0 голосов
/ 11 февраля 2019

Я использую прокси-тип, чтобы отложить работу, пока результат не будет присвоен переменной, он работает с использованием операторов преобразования для прокси-типа.При добавлении перегрузки оператора преобразования для std::string он работает для построения строки из прокси-сервера, но не компилируется для назначения со следующим сообщением об ошибке:

error: неоднозначная перегрузка для оператора =

Хотя этот вопрос похож на вопрос об операторе оператора T (), который не используется в присваивании , решение здесь не применимо, поскольку я также использую оператор преобразования с шаблонами.

Ниже приведен фрагмент:

#include <iostream>
#include <string>

struct Proxy
{
    template < typename T >
    operator T ()
    {
        T res;
        std::cerr << "Converting to T: " << typeid( T ).name() << "\n";
        return res;
    }

    operator std::string ()
    {
        std::string res;
        std::cerr << "Converting to string\n";
        return res;
    }
};


int main()
{
    struct Foo {};

    Proxy proxy;

    bool b = proxy; // Construct, works
    b = proxy;      // Assignment, works

    Foo f = proxy; // Construct, works
    f = proxy;     // Assignment, works

    std::string s = proxy; // Construct, works
    s = proxy;             // Assignment, this line fails to compile <<<<<

    return 0;
};

Как этот прокси можно настроить для работы со строковым присваиванием?

1 Ответ

0 голосов
/ 11 февраля 2019

Как этот прокси можно настроить для работы со строковым присваиванием?

Компилятор не может сказать, какое преобразование вы хотите.Это может быть что угодно, что можно использовать для построения std::string - char, char *, std::string, ...

Так что решение состоит в том, чтобы сообщить компилятору, что вы хотите.Сделайте явный вызов оператора:

s = proxy.operator std::string();
...