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_lockboost::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))