Есть ли неявный шаблоноператор << (const ostream &, T)? - PullRequest
0 голосов
/ 11 апреля 2011

У меня есть класс, который я написал, предназначенный для представления векторов (в смысле линейной алгебры).Я только начал писать, чтобы он не закончился, но я вставил его и тестовый код здесь

Я не совсем уверен, что происходит.Я собирался написать перегруженный оператор << для тестирования через секунду, поэтому я пошел дальше и поместил его в свою основную функцию (чтобы я мог использовать ошибки компилятора, чтобы убедиться, что я написал его правильно).</p>

Что означает это предупреждение?почему он смотрит на адрес v?Я попытался удалить скобки из v, и в результате я получил this , кучу ужасных ошибок шаблона: `

In function 'typename boost::range_const_iterator<C>::type boost::range_detail::boost_range_begin(const C&) [with C = vect<float, 3u>]':
/usr/local/include/boost/range/begin.hpp:164:   instantiated from 'typename boost::range_const_iterator<C>::type boost::begin(const T&) [with T = vect<float, 3u>]'
prelude/more_stdlib_ostreaming.hpp:64:   instantiated from 'void more_stdlib_ostreaming_detail::print_range(std::basic_ostream<_CharT, _Traits>&, const Range&) [with C = char, Tr = std::char_traits<char>, Range = vect<float, 3u>]'
prelude/more_stdlib_ostreaming.hpp:76:   instantiated from 'typename more_stdlib_ostreaming_detail::snd<typename R::iterator, std::basic_ostream<_CharT, _Traits>&>::type operator<<(std::basic_ostream<_CharT, _Traits>&, const R&) [with C = char, Tr = std::char_traits<char>, R = vect3f]'
t.cpp:42:   instantiated from here
Line 45: error: 'const class vect<float, 3u>' has no member named 'begin'`

Я могу что-то увидеть, что здесь происходит, хотя.Похоже, что он каким-то образом использует диапазон Boost для и пытается перебрать мой контейнер, и это терпит неудачу, потому что я не определил begin () и end ().То же самое происходит, если я создаю экземпляр v, используя v (some_float), а не без паренов.

Итак, два вопроса:

  1. Почему v() ведет себя иначе, чемv?Я думал, что объявление объекта без паренов всегда вызывает ctor по умолчанию, и явный вызов ctor по умолчанию не имеет значения?

  2. Что здесь делает компилятор кодпада (gcc 4.1.2)?Имеет ли он шаблон, который автоматически пытается сгенерировать соответствующий оператор <</li>

Кроме того, не стесняйтесь говорить мне что-нибудь еще, я делаю здесь глупый / неправильный / плохой стиль (помимо броска моей собственной математической математики)библиотека для развлечения, которая, как я знаю, не нужна. Я делаю это как упражнение)

1 Ответ

4 голосов
/ 11 апреля 2011

Прежде всего, vect3f v(); объявляет функцию (с именем v), не принимает параметров и возвращает vect3f. И вызываемый operator<< вызывается для этого указателя функции (который неявно преобразуется в bool, потому что для указателей на функции нет перегрузки).

vect3f v; - правильный способ создания объекта по умолчанию.

И нет, компилятор не будет пытаться сгенерировать ostream& operator<<(ostream& /* ... */) для вас. Однако существует много перегрузок для всех основных типов и даже некоторых других типов (таких как std::string).

Вы можете проверить все основные перегрузки здесь .

...