C ++使用if语句调用超类

时间:2016-12-31 20:51:44

标签: c++ if-statement boost superclass

我想我在这里遗漏了一些东西,但无法弄清楚是什么......

如果我这样做,我会收到编译错误“错误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语句?

谢谢!

2 个答案:

答案 0 :(得分:2)

这不是if语句,而是使用条件运算符 的表达式。此运算符的“true”和“false”操作数必须具有相同的类型(粗略地说),但(正如您的编译器所说),这些boost::try_to_lockboost::defer_lock之间不可能进行转换。

如果没有MCVE以及您正在尝试做什么的描述,我无法就如何实现目标给出正确的建议,但我可以告诉您,这不会削减它。

有时会误称为“三元运算符”,因为它是一个三元运算符,也是当前唯一定义的运算符。

答案 1 :(得分:1)

问题是boost::try_to_lockboost::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))