9

次のインターフェースを実装する必要があります

struct mutex;
struct interface
{
  //...
  mutex& getMutex();
};

私の実装では直感を使用できますusing mutex = ParticularMutexが、gcc はそうではないと教えてくれます。

error: conflicting declaration ‘using mutex = ’
error: ‘class mutex’ has a previous declaration as ‘class mutex’

私は何かを 2 回定義するのではなく、 2 回宣言するだけです。

  1. なぜこれが機能しないのですか?
  2. 変更せずに回避策はありinterfaceますか?
  3. どのようinterfaceに定義されるべきでしたか?とtemplate <typename mutex>?
4

4 に答える 4

11
  1. struct mutex;前方宣言はコンパイラにmutex新しい型であることを伝えるため、機能しません。次に、タイプaliasusingを作成します。これは、(コンパイラーに約束された)新しいタイプではなく、既存のタイプのエイリアスであることを意味します。

  2. いいえ。

  3. はい。


あなたができることは次のとおりです。

struct mutex : ParticularMutex {
    using ParticularMutex::ParticularMutex; // inherit constructors
};

ParticularMutexこれは、十分に互換性があることを願って派生した型を定義します。もちろん、これは新しいタイプであり、他の問題を引き起こす可能性があります。

于 2013-09-16T18:22:44.143 に答える
0
  • mutexまず、それが特定のクラス タイプであると言っています。その後、「ちょっと待って、mutexそれは独自のタイプではなく、実際にはこの別のタイプです」と言っています。その場合、コンパイラは何をすべきかわかりません。

  • using に置き換えるstruct mutextと、うまくいくはずです (私は C++11 の使用について完全に最新ではありません)。

  • 複数のミューテックス実装をサポートできるようにしたい場合は、インターフェイスをテンプレートにすることができます (または、どのミューテックス実装を呼び出すかを仮想的に決定するミューテックス抽象インターフェイスを使用します)。

于 2013-09-16T18:22:21.957 に答える