У меня другой вопрос, потому что он относится к более новой версии C ++.
Этот вопрос уже задавался здесь, и я имею в виду этот ответ. Однако об этом спросили и ответили еще в 2009 году, и это довольно устарело для текущих компиляторов и версий языка C ++. Тем не мение; вот оно снова.
У меня есть простой шаблонный класс, который я хотел бы перегрузить оператором потока, но в моем случае здесь: я использую Visual Studio 2017 CE v4.6.01055 с функцией компилятора C ++, установленной на ISO C++ Latest Draft Standard (/std:c++latest)
, просто поместите C ++ 17. Я собираю его в режиме отладки x86.
Я пробовал решение из приведенного выше Q / A, но оно продолжает давать мне ошибки компилятора.
Вот простой класс
template<class T>
class Point {
public:
T mX;
T mY;
Point() : mX(0), mY(0) {}
Point( T x, T y ) : mX( x ), mY( y ) {}
Point( T& x, T& y ) : mX( x ), mY( y ) {}
Point( T* x, T* y ) : mX( *x ), mY( *y ) {}
friend operator<<( std::ostream& out, const Point<T>& p );
}
В предложении говорилось, что вы должны сделать единственный экземпляр этого шаблона с именем specialization
другом. Пользователь также заявил, что вам нужно поместить объявление operator<<
над объявлением шаблона класса. Я пробовал это; Я попытался переместить метод из заголовка в cpp, ниже, выше; Я попытался даже поместить определение в класс, и не важно, что я пытаюсь; Не могу заставить его правильно скомпилировать.
Я даже нашел этот ответ и я попробовал шаблон там, но он все еще не работает в C ++ 17. По крайней мере, на данный момент это compiling
без специализации <>
и не может быть собран, но когда я добавляю это, он не может быть скомпилирован.
Каков правильный синтаксис и / или размещение для перегрузки оператора потока в качестве друга простого шаблона класса в c ++ 17? Я не обязательно имею в виду синтаксис самого operator<<()
... он должен был больше иметь дело с фактическим размещением объявлений и определений. Единственная часть синтаксиса, в которой я не был уверен, но выяснил из предыдущих ответов, которые я показал здесь, была часть о том, чтобы сделать его специализацией; эта часть была для меня новой.
ИЗМЕНИТЬ
Я не знаю, что вызвало ошибки компилятора или компоновщика. Заявления и определения были такими же. Я закончил тем, что изменил второй параметр с const Point<T>&
на Point<T>
в объявлениях и определении, и он скомпилирован и построен. Затем я снова изменил их на const Point<T>&
, и теперь он компилируется, строится и выдает мне результат без ошибок.
Это могло быть ошибкой в Visual Studio, поскольку вчера вечером я обновил ее до последней версии. Я не знаю, что было причиной этого; но то, что когда-либо было, теперь решено.
friend std::ostream& operator<<(std::ostream& out, const Point<T>& p)
- person Justin   schedule 10.03.2018Point<T>
, а не наconst Point<T>&
, и он компилировался и собирался без ошибок. Затем я снова изменил его наconst Point<T>&
, и я думаю, что теперь он работает. Я только что обновился до последней версии Visual Studio вчера вечером. - person Francis Cugler   schedule 10.03.2018