C ++ ostream_withassign с << ошибкой компиляции оператора - PullRequest
0 голосов
/ 25 мая 2018

Я работаю над устаревшим кодом со старым компилятором Solaris на Solaris 10 (здесь нет новых раскрученных C ++ 0x; -)

-bash-3.2 $ CC -V

CC: Sun C ++ 5.12 SunOS_sparc 2011/11/16

У меня есть сторонний словарный класс с итератором

template<K, V>
class DictIterator
{
    public:
        DictIterator(TheDictClass<K, V>& collection);
        K key() const;
        V value() const;
        // advance the iterator. return true if iterator points to a valid item
        bool operator()();
    ...
};

Мой код долженпросмотреть каждый элемент в словаре, но есть ошибка компиляции, которую я не могу объяснить:

DictIterator iterator(theDictionary);
while(iterator())
{
    cout << iterator.key(); 
}

Сбой с "filename.cc", line 42: Error: The operation "ostream_withassign<<Key" is illegal.

Но эта версия работает:

DictIterator iterator(theDictionary);
while(iterator())
{
    Key key(iterator.key());
    cout << key; 
}

Очевидно, у меня есть обходной путь, но я подумал, что, поскольку DictIterator.key() возвращает K (не ссылка), два фрагмента были довольно похожи.Может кто-нибудь дать мне знать, в какой странный угол C ++ я только что натолкнулся?

edit: Чтобы отвечать на комментарии, << переопределяется ostream& operator(ostream &, Key&);

1 Ответ

0 голосов
/ 28 мая 2018

operator<< получает правильный аргумент по неконстантной ссылке на lvalue.Это означает, что временные привязки не могут быть связаны с этим аргументом.

Метод key() возвращает временное значение.Только создав локальную переменную, вы можете превратить это временное значение в переменную, с которой может связываться ссылка lvalue.

Изменение аргумента оператора на const Key& решает эту проблему, потому что ссылка const lvalue может связываться с. временные конструкцииЭто должно быть минимально инвазивным и безопасным изменением - оно может не работать, только если оператор вывода использует неконстантную функциональность записываемого объекта, что само по себе будет большим красным флагом.Однако, если существующий код не является константно-корректным (то есть функции-члены, которые не изменяют свои объекты, не всегда помечаются как const), это может привести к длинному хвосту исправления таких нарушений константности.

...