Как написать перегрузку оператора c ++ для ввода / вывода, не зная тип при его использовании - PullRequest
0 голосов
/ 02 мая 2020

Я сделал оператор:

template <typename Container>
std::ostream& operator << (std::ostream& out, const Container& container) {
string result = "{";

out << result;

return out;
}

Когда я хочу его использовать:

enum class space { empty, full, half };
using elements_t = vector<space>;

int main(int argc, char** argv)
{
    elements_t elems = { space::half };
    cout << elems;
    return 0;
}

Выдает ошибку:

Оператор << is is неоднозначный. </p>

Как указать, что вы хотите использовать пользовательский? Я знаю, что с помощью шаблонной функции вы бы назначали типы впоследствии в <>, и если бы у меня был определенный c класс / структура, я мог бы сделать оператор локальным или дружественным, но что, если я хочу, чтобы он был глобальным?

1 Ответ

1 голос
/ 02 мая 2020

Если я попробую вашу программу, компилятор пожалуется на operator<<() внутри вашего пользовательского определения оператора (лучше скопировать точное сообщение об ошибке, включая номер строки). Я полагаю, вы хотите использовать std::operator<< здесь (повторение приведет к бесконечной рекурсии). Для этого вам нужно написать:

template <typename Container>
std::ostream& operator << (std::ostream& out, const Container& container) {
    std::string result = "{";

    std::operator<<(out, result);
    return out;
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...