IDE:vs2015
1 #include<unordered_map> 2 #include<string> 3 #include<vector> 4 #include<iostream> 5 6 using namespace std; 7 8 class Point 9 { 10 public: 11 Point(int id, int x, int y) :id_(id), x_(x), y_(y) 12 { 13 cout << " id_ = " << id_ << " x_ = " << x_ << " y_ = " << y_ << endl; 14 } 15 16 Point(const Point& p) 17 { 18 this->id_ = p.id_; 19 this->x_ = p.x_; 20 this->y_ = p.y_; 21 } 22 23 ~Point() {}; 24 int id_; 25 26 private: 27 int x_, y_; 28 }; 29 30 void dosomething(Point &points_) 31 { 32 unordered_map<int, Point> unordmap_points; 33 if (unordmap_points.find(points_.id_) == unordmap_points.end()) 34 { 35 cout << "hello!" << endl; 36 unordmap_points.insert(make_pair(points_.id_, points_)); 37 } 38 else 39 { 40 41 //unordmap_points[points_.id_] = points_; 42 cout << "goo-bye" << endl; 43 } 44 } 45 46 int main() 47 { 48 vector<Point> points; 49 const int maxnum[5] = {0,1,2,3,4}; 50 for (int i : maxnum) 51 { 52 points.push_back(Point(i, i, i)); 53 } 54 55 for (int i : maxnum) 56 { 57 dosomething(points[i]); 58 } 59 return 1; 60 }
41行代码注释后的的输出:
取消注释41行后:编译器报错
:
错误 C2512 “Point::Point”: 没有合适的默认构造函数可用 TEST1 d:\program files (x86)\microsoft visual studio 14.0\vc\include\tuple 1180
请问该怎么改?
另外,个人觉得 函数 dosomething() 中的 else情形是多余的?不知道为什么,看到某底层代码有else,搞不懂,来个大神解释一波哈?
正如Amedeo所说,你在STL多处用到了Point类,而且该类没有默认合成的构造函数,在执行遇到需要默认实例化该类时就会遇到如上编译错误。
你无法保证在定义STL模板类中何时会实例化你的自定义类,所以最好添加一个默认构造函数。
还有注意到,你注释掉的41行也是存在隐式漏洞的。
其一,你的默认构造函数没有了,默认的拷贝函数和赋值运算符重载也不存在。这里你使用了=运算符,而该定义确实不存在。
其二,你的参数是引用,那么赋值给map键值对中的对象的生命周期就移交给了它的定义语句所在作用域,也就是vector<Point>的地方,你的代码比较简单没有复杂的逻辑关系,但当你的代码复杂后,就无法保证map中是否存储了有效的数据,很可能已经销毁了的对象。
以上仅为个人看法,个人水平有限,可能存在疏漏,只是给你提示一下方向。谢谢
其实在类中加一个无参数构造函数就行了,哎,笨死了
如果你不显式定义一个构造函数,它就会自己定义一个无参的默认构造函数;如果你定义了构造函数,编译器就不会自动给你定义构造函数了。
你的类中自己定义了一个有参构造函数,没定义无参构造函数,那么下面如果无参构造就不能通过了