我想我在这里遗漏了一些东西,但无法弄清楚是什么......
如果我这样做,我会收到编译错误“错误C2446:':':没有从'const boost :: defer_lock_t'转换为'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语句?
谢谢!
答案 0 :(得分:2)
这不是if
语句,而是使用条件运算符 †的表达式。此运算符的“true”和“false”操作数必须具有相同的类型(粗略地说),但(正如您的编译器所说),这些boost::try_to_lock
和boost::defer_lock
之间不可能进行转换。
如果没有MCVE以及您正在尝试做什么的描述,我无法就如何实现目标给出正确的建议,但我可以告诉您,这不会削减它。
†有时会误称为“三元运算符”,因为它是一个三元运算符,也是当前唯一定义的运算符。
答案 1 :(得分:1)
问题是boost::try_to_lock
和boost::defer_lock
是完全不相关的类型,LockType( condition.mutex, boost::try_to_lock)
和LockType(condition.mutex, boost::defer_lock)
正在调用单独的重载。因此,您不能使用三元运算符在它们之间进行选择。
您的选择是:
一个。找到允许你在运行时切换的LockType
构造函数的另一个重载(这显然是最好的)
B中。如果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);
}
℃。使用通用解决方案来解决计算机科学中的问题:增加另一层次的间接性。将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))