首先要记住我是c ++的新手。我今天已经阅读了很多关于模板和字符串的内容,但我无法想出几件事情。当我在我的测试类中使用点< 2>创建一个点时或任何其他价值。我有一个错误:请求会员' tostring'在' v2'这是非类型的...... 1.为什么我会收到错误? 2.如何使Point()=默认;使每个坐标值为0.0;就像我有点< 1>它将是(0.0),点< 2>将是(0.0,0.0),依此类推:。
#ifndef POINT_H
#define POINT_H
#include <iostream>
#include <list>
#include <sstream>
#include <string>
using std::stringstream;
#include <cmath>
using namespace std;
template<unsigned short n>
class Point {
public:
list <float> coords = {0.0};
Point <n>() = default;
Point <n>(list<float> coords){
this-> coords=coords;
}
string toString(){
string sone;
ostringstream ss;
sone.append("(");
auto it3= coords.begin();
while ((it3) != coords.end()){
ss << (*it3);
sone.append(ss.str());
ss.str("");
}
sone.append(")");
return sone;
}
float distanceFrom (Point <n> v){
float s=0;
list<float> coords;
auto it1= coords.begin();
auto it2= v.coords.begin();
while ((it1) != coords.end()){
s+=(*it1 -*it2)*(*it1-*it2);
it1++;
it2++;
}
return sqrt(s);
}
friend std::ostream& operator <<(std::ostream& out, const Point<n>& v)
{
out << "("<<"Test"<<")";
return out;
}
};
#endif
答案 0 :(得分:1)
在方法toString中增加迭代器并且它可以工作:
string toString(){
string sone;
ostringstream ss;
sone.append("(");
auto it3= coords.begin();
while ((it3) != coords.end()){
ss << (*it3);
sone.append(ss.str());
ss.str("");
++it3;
^^^
}
sone.append(")");
return sone;
}
关于模板的说明:
在课堂内你不需要说Point<n>
,只需Point
:
Point () = default;
Point ( list<float> coords){ //...}
要打印Point,您必须toString
方法const
:
string toString() const { //... }
启用const点的调用。现在,您可以在operator<<
:
friend std::ostream& operator <<(std::ostream& out, const Point<n>& v) {
out << v.toString();
return out;
}