“error: no matching function for call to”
我在Copdad上,我试图用C++来增强我的技能。我以前从来没有用过很多模板,所以我试着研究如何使用它们。下面的代码就是结果,不幸的是,它不起作用。我确实试图寻找解决我问题的方法,但是由于我没有使用模板的经验,我无法在我的问题和其他问题之间建立任何联系。所以,我决定寻求帮助。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | template <class A> class Vector2 { public: A x,y; Vector2(A xp, A yp){ this->x = xp; this->y = yp; } }; template <class B, class A> class rayToCast { public: rayToCast(B angle, Vector2<A> origin, Vector2<A> point1, Vector2<A> point2){ this->RAngle = angle; this->Point1 = point1; this->Point2 = point2; } private: B RAngle; Vector2<A> point1,point2; }; int main(){ rayToCast<short int, float> ray(45, Vector2<float>(0.0, 0.0), Vector2<float>(-10.0, -3.0), Vector2<float>(5.0, 7.0)); return 0; } |
输出结果如下:
1 2 3 4 | t.cpp: In constructor 'rayToCast<B, A>::rayToCast(B, Vector2<A>, Vector2<A>, Vector2<A>) [with B = short int, A = float]': t.cpp:26: instantiated from here Line 14: error: no matching function for call to 'Vector2<float>::Vector2()' compilation terminated due to -Wfatal-errors. |
号
感谢您的帮助。
您要么为Vector类提供一个默认的构造函数,要么显式初始化
1 2 3 | rayToCast(B angle, Vector2<A> origin, Vector2<A> point1, Vector2<A> point2) : RAngle(angle), point1(point1), point2(point2) { } |
您的代码中有两个问题:
vector2没有默认构造函数,将vector2传递给
1 | rayToCast(B angle, Vector2<A> origin, Vector2<A> point1, Vector2<A> point2) |
您需要向vector2添加默认构造函数,并将
1 2 3 4 5 6 7 8 9 10 | template <class A> class Vector2 { public: A x,y; Vector2() : x(), y() {} // default constructor Vector2(A xp, A yp){ this->x = xp; this->y = yp; } }; |
另外,您有错别字,应该是point1,point2而不是point1/point2。
1 2 3 4 5 6 7 8 9 10 11 12 | class rayToCast { public: rayToCast(B angle, Vector2<A> origin, Vector2<A> point1, Vector2<A> point2){ this->RAngle = angle; this->Point1 = point1; this->Point2 = point2; } private: B RAngle; Vector2<A> Point1; // capital P Vector2<A> Point2; // capital P }; |
错误与模板无关。
您的
在
如果不声明构造函数,则会自动生成默认构造函数(默认构造函数和复制构造函数)。
当您声明一个构造函数时,您将不再获得自动生成的构造函数(因此,如果需要的话,您必须手动定义其他的构造函数)。
因为您定义了
将这部分代码:
1 2 3 4 5 | rayToCast(B angle, Vector2<A> origin, Vector2<A> point1, Vector2<A> point2){ this->RAngle = angle; this->Point1 = point1; this->Point2 = point2; } |
对于未初始化的C++程序员,它看起来像是初始化EDCOX1 4和EDCOX1,5,但是它没有。初始化是在默认情况下完成的(这在这里不可能发生,因为
您可能有理由不给
1 2 3 4 5 | rayToCast(B angle, Vector2<A> origin, Vector2<A> point1, Vector2<A> point2) : RAngle(angle) , point1(point1) , point2(point2) {} |
我还建议您整理变量名和参数名,因为它们让我有点困惑(这里大写,不在那里,不在哪里,到处都是,在哪里,那里!).
正如其他人已经指出的,错误是您缺少默认的构造函数。使用bo persson建议的语法。
另一个错误是变量名区分大小写,例如,在
1 | this->Point1 = point1; |
但是,您将类属性命名为
1 | this->Point1 = point1; |