我有一个带有两个构造函数的类。一个用于bool
,另一个用于A*
。
struct B
{
explicit B(bool b)
{
std::cout << "B(bool)" << std::endl;
}
explicit B(A*)
{
std::cout << "B(A*)" << std::endl;
}
};
当应使用const A*
而不是A*
构造B时,const A*
将转换为bool
。
const A a;
B b(&a);
输出: B(bool)
所需的解决方案是
编译器错误:“ B(const A *)没有有效的构造函数”
我已经尝试使用explicit
关键字,但是没有用。
答案 0 :(得分:5)
我们无法停止从指向bool
的指针的隐式转换(bool conversion);您可以添加另一个带有const A*
的重载构造函数,在传递const A*
时将在overload resolution中选择该构造函数,因为它是完全匹配的,并且B::B(bool)
需要隐式转换。将其标记为delete
时,如果选中该程序,它将格式错误。
struct B
{
explicit B(bool b)
{
std::cout << "B(bool)" << std::endl;
}
explicit B(A*)
{
std::cout << "B(A*)" << std::endl;
}
B(const A*) = delete;
};
或者您可以标记重载的构造函数为指针类型delete
,然后所有的指针类型都不能传递给B::B
,除了A*
以外,构造函数的声明类似于你已经完成了。
template <typename T>
B(T*) = delete;