C++ 使用 if 语句调用超类
C++ calling superclass with if statment
我想我在这里遗漏了一些东西,但无法弄清楚是什么..
如果我这样做,我会得到编译错误 "error C2446: ':': no conversion from 'const boost::defer_lock_t' to 'const boost::try_to_lock_t'"
public:
explicit BasicScopedLock( CCondition& condition, bool initiallyLocked = true )
: LockType( condition.mutex, (initiallyLocked == true ? (boost::try_to_lock) : (boost::defer_lock)) )
, m_condition( condition )
{
}
但是如果我这样做,它会编译。
public:
explicit BasicScopedLock( CCondition& condition, bool initiallyLocked = true )
: LockType( condition.mutex, boost::try_to_lock )
, m_condition( condition )
{
}
这也行...
public:
explicit BasicScopedLock( CCondition& condition, bool initiallyLocked = true )
: LockType( condition.mutex, boost::defer_lock )
, m_condition( condition )
{
}
有人知道为什么编译器不喜欢这里的 if 语句吗?
谢谢!
这不是if
语句,而是使用条件运算符†的表达式。此运算符的 "true" 和 "false" 操作数必须具有相同的类型(粗略地说),但是(正如您的编译器所说)这些 boost::try_to_lock
和 [=12= 之间不可能进行转换].
如果没有 MCVE 和您想要做什么的描述,我无法就如何实现您的目标给出适当的建议,但我可以告诉您,这不会削减它。
†有时会被误称为"ternary operator",因为它是a三元运算符且唯一当前定义的一个。
问题是 boost::try_to_lock
和 boost::defer_lock
是完全不相关的类型,而 LockType( condition.mutex, boost::try_to_lock)
和 LockType(condition.mutex, boost::defer_lock)
正在调用单独的重载。因此,您不能使用三元运算符在它们之间进行选择。
您的选择是:
一个。找到 LockType
构造函数的另一个重载,允许您在运行时切换(这显然是最好的)
乙。如果LockType
是可移动类型,那么你可以写一个函数:
CLockType create_lock_type( CMutex& mutex, bool initiallyLocked)
{
if (initiallyLocked)
return CLockType(mutex,boost::try_to_lock);
else
return CLockType(mutex,boost::defer_lock);
}
C。使用计算机科学问题的通用解决方案:添加另一个间接级别。将 LockType
的声明更改为:
std::unique_ptr<CLockType> pLockType;
和初始化为:
: pLockType(initiallyLocked?
std::make_unique<CLockType>(condition.mutex, boost::try_to_lock):
std::make_unqiue<CLockType>(condition.mutex, boost::defer_lock))
我想我在这里遗漏了一些东西,但无法弄清楚是什么..
如果我这样做,我会得到编译错误 "error C2446: ':': no conversion from 'const boost::defer_lock_t' to 'const boost::try_to_lock_t'"
public:
explicit BasicScopedLock( CCondition& condition, bool initiallyLocked = true )
: LockType( condition.mutex, (initiallyLocked == true ? (boost::try_to_lock) : (boost::defer_lock)) )
, m_condition( condition )
{
}
但是如果我这样做,它会编译。
public:
explicit BasicScopedLock( CCondition& condition, bool initiallyLocked = true )
: LockType( condition.mutex, boost::try_to_lock )
, m_condition( condition )
{
}
这也行...
public:
explicit BasicScopedLock( CCondition& condition, bool initiallyLocked = true )
: LockType( condition.mutex, boost::defer_lock )
, m_condition( condition )
{
}
有人知道为什么编译器不喜欢这里的 if 语句吗?
谢谢!
这不是if
语句,而是使用条件运算符†的表达式。此运算符的 "true" 和 "false" 操作数必须具有相同的类型(粗略地说),但是(正如您的编译器所说)这些 boost::try_to_lock
和 [=12= 之间不可能进行转换].
如果没有 MCVE 和您想要做什么的描述,我无法就如何实现您的目标给出适当的建议,但我可以告诉您,这不会削减它。
†有时会被误称为"ternary operator",因为它是a三元运算符且唯一当前定义的一个。
问题是 boost::try_to_lock
和 boost::defer_lock
是完全不相关的类型,而 LockType( condition.mutex, boost::try_to_lock)
和 LockType(condition.mutex, boost::defer_lock)
正在调用单独的重载。因此,您不能使用三元运算符在它们之间进行选择。
您的选择是:
一个。找到 LockType
构造函数的另一个重载,允许您在运行时切换(这显然是最好的)
乙。如果LockType
是可移动类型,那么你可以写一个函数:
CLockType create_lock_type( CMutex& mutex, bool initiallyLocked)
{
if (initiallyLocked)
return CLockType(mutex,boost::try_to_lock);
else
return CLockType(mutex,boost::defer_lock);
}
C。使用计算机科学问题的通用解决方案:添加另一个间接级别。将 LockType
的声明更改为:
std::unique_ptr<CLockType> pLockType;
和初始化为:
: pLockType(initiallyLocked?
std::make_unique<CLockType>(condition.mutex, boost::try_to_lock):
std::make_unqiue<CLockType>(condition.mutex, boost::defer_lock))