Ошибка оператора C++
Получить эту ошибку:
C: \ CodeBlocks \ kool \ praks3 \ vector.h | 62 | error: передача 'const Vector<2u>' в качестве аргумента 'this' для std::string Vector::toString() [с коротким unsigned int n = 2u]'отбрасывает классификаторы |
с этим кодом:
#include <iostream>
#include <vector>
#include <cmath>
#include <string>
#include <sstream>
template <unsigned short n>
class Vector {
public:
std::vector<float> coords;
Vector();
Vector(std::vector<float> crds);
float distanceFrom(Vector<n> v);
std::string toString();
template <unsigned short m>
friend std::ostream& operator <<(std::ostream& out, const Vector<m>& v);
};
template <unsigned short n>
std::string Vector<n>::toString() {
std::ostringstream oss;
oss << "(";
for(int i = 0; i < n; i++) {
oss << coords[i];
if(i != n - 1) oss << ", ";
}
oss << ")";
return oss.str();
}
template <unsigned short m>
std::ostream& operator<<(std::ostream& out, const Vector<m>& v) {
out << v.toString(); // ERROR HEEEERE
return out;
}
3 ответа
Сделать toString
метод const
:
std::string toString() const;
а также
template <unsigned short n>
std::string Vector<n>::toString() const{...}
Это потому, что вы добавляете const
квалификатор к Vector
в operator<<
, Вам разрешено только звонить const
квалифицированные методы на const
квалифицированные объекты.
Это потому, что ваш вектор объявлен как const, а ваш оператор toString не является методом const. Поэтому вызов этого метода запрещен с постоянным мгновением. Если вы не редактируете вектор при преобразовании его в строку, вы должны объявить его как метод const:
std::string toString() const;
Если у тебя есть const Foo
, вы можете только призвать const
функции-члены на нем. Так объявите это как std::string toString() const
,