在这种情况下,我不知道真正的问题,但我想这是类型转换的问题(如我所见,这是显式类型转换或隐式类型转换)。
这里是产生编译错误的代码示例。
class Vector
{
public:
Vector(double x, double y) : x_(x), y_(y){}
private:
double x_, y_;
};
class Operation
{
public:
class ConcreteOp
{
public:
ConcreteOp(const Vector& v) : v_(v){}
private:
Vector v_;
};
Operation(const ConcreteOp& op) : op_(op){}
private:
ConcreteOp op_;
};
class Method
{
public:
Method(const Operation& op) : op_(op){}
private:
Operation op_;
};
void test(const Method& m)
{
}
int main()
{
Vector v(2, 2);
Method m( Operation( Operation::ConcreteOp(v) ) );
test(m);
return 0;
}
编译错误如下:
invalid initialization of reference of type «const Method&» from expression of type «Method(Operation (*)(Operation::ConcreteOp))»
test(m);
^
在我的工作项目中,编译错误的开始有所不同:
no matching function for call to «Program::Ship::testMethod(Program::Object::Transformation::Method (&)(Program::TransformOperation))»
testMethod(m);
^
同时编译以下代码没有问题:
int main()
{
Vector v(2, 2);
Method m( Operation( Operation::ConcreteOp(Vector(2, 2) /* v*/ ) ) );
test(m);
return 0;
}
还有两个括号可以解决问题:
int main()
{
Vector v(2, 2);
Method m( (Operation( Operation::ConcreteOp(/*Vector(2, 2)*/ v ) ) ) );
// ^ ^
test(m);
return 0;
}
出什么问题了?
答案 0 :(得分:4)
Method m( Operation( Operation::ConcreteOp(v) ) );
这将声明一个名为m
的函数,返回Method
并将该函数作为参数;它没有声明名为m
的变量。使用大括号,如下所示:
Method m { Operation( Operation::ConcreteOp(v) ) };
另请参阅:most vexing parse