0

int と int& の両方を取るコンテナーを作成しようとしています。1つのクラスでそれを行うとうまくいきます:

template <class T>
class unified_class
{
public:
    virtual void f(T &i){}
    virtual void f(T &&i) {}
};

呼び出し:

unified_class<int> u;
u.f(8); // going to the second method
int a = 9;
u.f(a); // going to the first method

しかし、それを2つのクラスに分割しようとすると、奇妙なことが起こっています:

template <class T>
class base_class
{
public:
    virtual void f(T &&i) { /* it never reaches here*/}
};

template <class T>
class derived_class : public base_class<T>
{
public:
    using base_class<T>::f;
    virtual void f(T &i){}
};

前から同じ関数呼び出しを呼び出すと、どちらの場合も派生クラスの f() が呼び出されます。

私は何かが恋しいですか?

4

3 に答える 3

1

g++ 4.6.3 では問題が発生していません。これは私が使用したコードです:

#include <iostream>

using std::cerr;

template <class T>
class base_class
{
public:
    virtual void f(T &&i) { cerr << "base_class\n"; }
};

template <class T>
class derived_class : public base_class<T>
{
public:
    using base_class<T>::f;
    virtual void f(T &i) { cerr << "derived_class\n";  }
};

int main(int argc,char **argv)
{
  derived_class<int> u;
  u.f(8); // going to the second method
  int a = 9;
  u.f(a); // going to the first method
}

そして、私はこの結果を得ました:

base_class
derived_class
于 2012-05-06T03:23:38.437 に答える
1

投稿したコードを使用しているという結果が実際に表示されている場合、これは間違いなくコンパイラのバグです。T が "int" の場合、定数で f(T&) を呼び出すことはできません。なんらかの隠蔽が行われていたとしても、using がそれを処理していると思いますが、プログラムは間違った関数を呼び出すのではなく、完全にコンパイルに失敗するはずです。

于 2012-05-06T04:10:34.653 に答える
1

非 const参照に一時的にバインドする拡張機能としてこの機能を提供する Visual Studio 2010 を使用しています。T&そのため、どちらの場合もバージョンを呼び出しています。このコンパイラ拡張機能は、標準で定義された動作を置き換えるため、コンパイラ バグと呼ぶべきです。

ただし、標準 C++ では、整数リテラルから作成された一時オブジェクトは非 const8参照にバインドしてはならないため、呼び出しは引数として受け取る関数に解決される必要があります。T&&

于 2012-05-06T04:20:37.237 に答える