операторы преобразования с ++ нет лучшего кандидата - PullRequest
3 голосов
/ 20 декабря 2010
    #include <iostream>
#include <string>

using namespace std;

class test {
    private:
        std::string strValue;
        int value;

    public:
        test():value(0) { };
        test(int a):value(a) { };
        test(std::string a):strValue(a) { };
        ~test(){};

        operator int () { return value; }
        operator const char* () { return strValue.c_str(); }
};

int main() {
    test v1(100);
    cout << v1  << endl;
    return 0;
}

Когда я запускаю вышеизложенное, с gcc я получаю сообщение об ошибке, утверждающее, что ни один из кандидатов не подходит для конвертации. Разве это не эксклюзивные типы?

Ответы [ 2 ]

5 голосов
/ 20 декабря 2010

std::ostream имеет многочисленные operator<< перегрузки, включая следующие:

std::ostream& operator<<(std::ostream&, const char*);
std::ostream& operator<<(std::ostream&, int);

Ваш класс test может быть преобразован в const char* и int. Компилятор не может выбрать, какое преобразование использовать, потому что оба преобразования будут работать одинаково хорошо. Таким образом, преобразование неоднозначно.

0 голосов
/ 20 декабря 2010

тест v1 (100);cout << v1 << endl; </p>

Поскольку cout не имеет оператора << (ostream &, test), он пытается выполнить преобразования.Вы предоставили два, оба типа определены с ostream, поэтому вы получили двусмысленность. </p>

...