我的Clion IDE向我显示,当我将const double*
类型转换为具有参数const A
的函数时,可能存在问题,当A
使用双数组定义时,如下所示。
当A
的第二个构造函数是显式时,存在编译错误,但是当A
的第二个构造函数不明确时,一切正常。我认为应该从const double*
到const A
铸造,但我不确定。然后我调试了代码,我看到只调用了A
的第一个构造函数。
那么,为什么第二个构造函数不是明确的呢?
class A {
public:
friend class B;
private:
A(double v1, double v2): _x{v1, v2}{}
explicit A(const double *arr2): _x{*arr2, *(arr2+1)}{}
double _x[2];
};
class B {
private:
A _b1, _b2;
static double foo(const A &first, const A &second){
return first._x[0]*second._x[1];
}
public:
B(): _b1(2.1, 2.2), _b2(1.2, 1.1){}
B(double List[2][2]): _b1(List[0][0],List[0][1]), _b2(List[1][0], List[1][1])
{}
void Problem( const double* bArr, double* result) const{
double goesTo=thisfunc();
*result =foo(bArr, _b1)/goesTo; //this is where Clion states a possible problem
}
double thisfunc() const{
return foo(_b1, _b2);
}
};
int main() {
double initArray[][2]={{2,1},{1,1}};
B M(initArray);
return 0;
}
看起来你正在将指针bArr
传递给引用参数。您可能希望首先取消引用指针:
*result =foo(*bArr, _b1)/goesTo;
此外,我99%肯定这正是错误消息所指出的。
回答你的问题。从指针到引用没有隐式转换(转换)。您必须明确使用dereference运算符--prefixed*
。复制构造函数不是构造函数,也不是构造函数。
类T
中的强制转换运算符从T
转换为其他类型。复制构造函数将T
的一个实例复制到另一个T
实例。具有一个其他类型的参数的普通构造函数可以被视为将所述其他类型转换为类型为T
的实例。
编辑:正如Pete Becker指出的那样,这并没有解决问题,因为explicit A(const double *arr2)
被标记为显式,从而禁止编译器执行允许它执行的一次隐式转换。所以正确的解决方案是直接从A
创建bArr
或将其标记为隐式
问题中的代码很复杂,但问题很简单。
void f(const A&);
double data[] = { 1.0, 2.0 };
f(data); // error
当A(const double*)
被标记为explicit
时,编译器不允许使用它来隐式地将data
转换为A
类型的对象。为了使用该构造函数,代码必须具有显式转换:
f(static_cast<A>(data));
毕竟,这就是explicit
的意思。