2017-03-14 7 views
3

代わりに、基本クラス内の関数(左辺値)の派生クラスでメソッド呼び出し(左辺値)関数に結合(右辺値):私はC++私はCに新しいです++と以下のようにインタフェースを記述しようとしている

template <class T> 
class Comparable 
{ 
    protected: 
     Comparable(){}; 
    public: 
     virtual int compare(const T&&)=0; 
     int compare(const T& o) 
     { 
     return this->compare(std::move(o)); 
     } 
}; 

これは、両方のl/r値で動作するcompareメソッドを取得しようとするためです。

Monkey m1(argv[1]), m2(argv[2]); 
printf("\"%s\" \"%s\" %d\n", m1.getName(), m2.getName(), m2.compare(m1)); 

をしかし、私はコンパイルエラーを取得:次のようにmain()メソッドで

class Monkey : Comparable<Monkey> 
{ 
    private: 
     char name[512]; 
    public: 
     Monkey(const char*&& name) 
     { 
     strcpy(this->name, name); 
     } 
     const char *getName() { return name; } 
     int compare(const Monkey&& m) 
     { 
     return strcmp(name, m.name); 
     } 
}; 

バインドすることはできません「テストを::猿を 私は、Comparableから、次のクラスを派生しました'lvalue to' constテスト:: Monkey & & ' ' virtual int 'のテスト引数:: monkey :: compare(constテスト:: Monkey & &) ' ビルドに失敗しました

メソッド呼び出しが基本クラスのcompareメソッドにバインドされないのはなぜですか?

基本クラスの仮想として作成し、派生クラスの両方でそれらを作成すると、バインディングはうまく動作しますが、動作しませんし、書かれたとおりにコンパイルしようとするとコンパイルエラーが発生しますここに。

+0

私は本当にあなたが右辺値参照を使用する理由が表示されませんどこにでも。 'compare'関数の通常のconst-referenceはうまく動作します。 rvalue参照を 'const char *'に渡しますか?それは本当にあまり意味がありません。最後に、一定の値の参照はしばしば意味をなさない。 –

+0

私はC++を初めて使っています。私は参照が関数呼び出しのデフォルトの動作であるコピーを防止すると考えているので、それらを使用する習慣に入り、それらに慣れるのは良い方法かもしれないと思った。そして前にconst参照を見たことがあります。パフォーマンスの影響はごくわずかですが、 –

+0

@JoePaulリファレンスは、[オーバーヘッド](http://stackoverflow.com/questions/8250932/what-is-the-overhead-of-passing-a-reference)も紹介しています。 const左辺参照はあなたのケースでperferectを行います。右辺値参照は、主に完全な転送および移動セマンティクスに使用されます。 – felix

答えて

3

これは名前の非表示です。派生クラスのnameは、ベースクラスのnameを隠します。つまり、異なるスコープで関数をオーバーロードすることはできません。 m2.compare(m1)ためunqualified name lookupの規則に従って

m2タイプMonkeyであり、名前compareはその後、ルックアップ停止に名前を付け、まず派生クラスMonkeyの範囲にあります。基本クラスのcompareは、次の過負荷解決のために考慮されません。

(強調鉱山)

For an unqualified name, that is a name that does not appear to the right of a scope resolution operator ::, name lookup examines the scopes as described below, until it finds at least one declaration of any kind, at which time the lookup stops and no further scopes are examined.

あなたはusingによって派生クラスのスコープに、基本クラスの名前を紹介することができます

class Monkey : Comparable<Monkey> 
{ 
     ... 

     using Comparable<Monkey>::compare; 
     int compare(const Monkey&& m) 
     { 
     return strcmp(name, m.name); 
     } 
}; 
+0

ありがとうございます。私の質問に答えました。 –

関連する問題