пересылка всего класса с оператором - PullRequest
6 голосов
/ 25 июня 2011

Мне интересно. Я столкнулся с проблемой, и вот небольшое воспроизведение. По сути, я хочу переслать все. Проблема в том, что использование первого << приведет к ошибке с <code>o<<1 (или o<<SomeUserStruct(). Если я добавлю второе, я получу ошибки, связанные с неоднозначностью. Есть ли способ, которым я могу написать этот код, чтобы он использовал T& когда он может иначе использовать T?

#include <iostream>
struct FowardIt{
    template<typename T> FowardIt& operator<<(T&t) { std::cout<<t; return *this; }
    //template<typename T> FowardIt& operator<<(T t) { std::cout<<t; return *this; }
};

struct SomeUserStruct{};

int main() {
    FowardIt o;
    o << "Hello";
    int i=1;
    o << i;
    o << 1;
    o << SomeUserStruct();
}

1 Ответ

10 голосов
/ 25 июня 2011
template<typename T> FowardIt& operator<<(const T&t)
                                        //^^^^^ put const here

Сделайте ссылку на параметр const, как показано выше.Потому что временные ссылки не могут быть связаны с неконстантной ссылкой.Вам не нужно определять другую функцию.Просто сделайте параметр const, проблема будет решена.

Было бы также лучше, если бы вы также создали шаблон функции const, поместив const в крайнюю правую часть функции следующим образом:

template<typename T> 
const FowardIt& operator<<(const T&t) const
^^^^^                      ^^^^^      ^^^^^
  |                          |          |
  |                          |          put const here as well
  |                          put const here
  |
  You've to make the return-type also const
  since it can't return non-const reference anymore

Если вы сделаете это, то можете вызвать эту функцию и для const объектов:

void f(const FowardIt &o)//note: inside the function, o is an const object!
{
    o << 1;
    o << SomeUserStruct();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...