Ошибка оператора 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,

Другие вопросы по тегам