2016-12-31 8 views
0

は私がこれを行う場合、私はエラー「エラーC2446コンパイル取得C++なステートメント

..私はここで何かが足りないと思うが、何を把握することはできません場合にスーパークラスを呼び出す: 『:』: 'から変換なしにconstのブースト:: 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) 
{ 
} 

しかし、私はこれを行う場合、それはコンパイル「から' constのブースト:: defer_lock_t。これは、あまりにも動作します

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) 
{ 
} 

誰もがここに声明場合、コンパイラは好きではない理由についての手掛かりを持っていますか?

ありがとうございました!

+0

どこ 'if'文があるLockTypeへの宣言を変更しますか?あなたは '三元表現'を意味しましたか? – Barmar

+0

'if'文はどこにありますか?あなたは_条件式を意味しましたか? –

+0

「クラスを呼び出す」とはどういう意味ですか?メソッドは、クラスではなく呼び出すことができます(あなたが 'operator()'について話している場合を除く)。 –

答えて

1

問題は、boost::try_to_lockboost::defer_lockを完全に無関係なタイプのものであるということである、とLockType(condition.mutex, boost::try_to_lock)LockType(condition.mutex, boost::defer_lock)は、別個のオーバーロードを呼び出しています。したがって、三項演算子を使用してそれらの間で選択することはできません。

あなたのオプションは以下のとおりです。LockTypeは可動型の場合

A.が

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); 
} 

C.は、コンピュータサイエンスの問題へのユニバーサルソリューションを使用するには:間接の別のレベルを追加するには、関数を書くことができます。

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)) 
+0

'LockType'を' CLockType'に変更しましたか? –

+0

まあ、私はあなたのコードの書式スタイルやその演算子の命名に同意できませんが、これは間違いなく良い答えです;) –

+0

ありがとうございます。私はオプションBで問題を修正しました。重複して問題をクローズして申し訳ありません。 (私はStackoverflowに慣れていて、まだこのウェブサイトの使用方法を学んでいます:))。明けましておめでとうございます! – hinewwiner

2

これはifステートメントではありませんが、条件演算子を使用する式&dagger;。この演算子の "真"と "偽"オペランドは、同じタイプ(大まかに言えば)でなければなりませんが、コンパイラが言うように、boost::try_to_lockboost::defer_lockの間で変換はありません。

MCVEがなく、目標を達成する方法について適切な提案をすることはできませんが、これはそれをカットしないことを伝えることができます。

&dagger;それは三項演算子と現在定義されている唯一のものですので、は時々誤って、「三項演算子」と呼ばれます。

+1

「間違って」呼ばれていません。それは単にそれのもう一つの一般的な名前です(私はそれがより一般的なものであることを賭けたいと思います)。 – Barmar

+0

@Barmar:それは間違いです。誤った違う。よく使われる?はい;それらの3つの事柄をそれほど減らさない。誤った情報を広げて、別の羊になるのではなく、正しかった、真実で公正なものを立ててください。 –

+1

言語では、よく使われていることが正しいです。誰もがそれを言って理解しているなら、それが意味することです。 – Barmar