2011-03-13 1 views
0

получаю эту ошибку:C++ ошибка оператора

C: \ CodeBlocks \ Kool \ praks3 \ vector.h | 62 | Ошибка: проезжают 'Const Вектор < 2u>' как 'этого' аргумент «станд :: строка 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; 
} 
+1

Поздравляю. Итак, каков ваш вопрос? Я не вижу ни одного вопросительного знака в приведенном выше. – AnT

ответ

4

Сделать toString метод const:

std::string toString() const; 

и

template <unsigned short n> 
std::string Vector<n>::toString() const{...} 

Это потому, что вы добавляете const спецификатор к Vector в operator<<. Вы можете разрешить только const квалифицированным методам на const квалифицированных объектах.

0

Если у вас есть const Foo, вы можете использовать только функции-члены const. Поэтому объявите его как std::string toString() const.

1

Это потому, что ваш вектор объявлен как const, а ваш оператор toString не является методом const. Следовательно, вызов этого метода запрещен с помощью константного момента. Если вы не изменить вектор при преобразовании его в строку, вы должны объявить его как константный метод:

std::string toString() const;