以下有一个非常奇怪的错误:

在标头中,我有:

class WCameraPosition : public Widget3D
    {
    public:

        WCameraPosition(double scale = 1.0);
        WCameraPosition(const Matx33d &K, double scale = 1.0, const Color &color = Color::white());
        WCameraPosition(const Vec2d &fov, double scale = 1.0, const Color &color = Color::white());
        WCameraPosition(const Matx33d &K, InputArray image, double scale = 1.0, const Color &color = Color::white());
        WCameraPosition(const Vec2d &fov, InputArray image, double scale = 1.0, const Color &color = Color::white());
    };
class  Widget3D : public Widget
    {
    public:
        Widget3D() {}
    //...
}

typedef Matx<double, 3, 3> Matx33d;


出于某些原因,将编译以下内容:

WCameraPosition camSymbol1(Matx33d(K));
WCameraPosition camSymbol2(1.0);
Widget w(camSymbol2);


但这不是:

WCameraPosition camSymbol1(Matx33d(K));
WCameraPosition camSymbol2(1.0);
Widget w(camSymbol1);


我得到错误:

error: no matching function for call to ‘Widget3D::Widget3D(
WCameraPosition (&)(Matx33d))’
note: Widget3D::Widget3D(const Widget3D&)
no known conversion for argument 1 from ‘WCameraPosition(Matx33d)
{aka WCameraPosition(Matx<double, 3, 3>)}’ to
‘const Widget3D&’


我对此完全迷住了。就像创建了新的模板化类型一样,但是WCameraPosition及其超类甚至不使用模板。
我需要将camSymbol1传递给采用Widget3D&的函数。我该如何解决?

最佳答案

这是the most vexing parse的情况。编译器认为这是一个函数声明:

WCameraPosition camSymbol1(Matx33d(K));


通过使用花括号初始化对象来修复此问题:

WCameraPosition camSymbol1{Matx33d(K)};

关于c++ - C++无法在构造函数中使用模板化参数转换类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42383774/

10-11 22:37
查看更多