代わりに、基本クラス内の関数(左辺値)の派生クラスでメソッド呼び出し(左辺値)関数に結合(右辺値):私は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メソッドにバインドされないのはなぜですか?
基本クラスの仮想として作成し、派生クラスの両方でそれらを作成すると、バインディングはうまく動作しますが、動作しませんし、書かれたとおりにコンパイルしようとするとコンパイルエラーが発生しますここに。
私は本当にあなたが右辺値参照を使用する理由が表示されませんどこにでも。 'compare'関数の通常のconst-referenceはうまく動作します。 rvalue参照を 'const char *'に渡しますか?それは本当にあまり意味がありません。最後に、一定の値の参照はしばしば意味をなさない。 –
私はC++を初めて使っています。私は参照が関数呼び出しのデフォルトの動作であるコピーを防止すると考えているので、それらを使用する習慣に入り、それらに慣れるのは良い方法かもしれないと思った。そして前にconst参照を見たことがあります。パフォーマンスの影響はごくわずかですが、 –
@JoePaulリファレンスは、[オーバーヘッド](http://stackoverflow.com/questions/8250932/what-is-the-overhead-of-passing-a-reference)も紹介しています。 const左辺参照はあなたのケースでperferectを行います。右辺値参照は、主に完全な転送および移動セマンティクスに使用されます。 – felix