6

このコードを見てください:

template<class T>
class A
{
 class base
 {

 };

 class derived : public A<T>::base
 {

 };

public:

 int f(typename A<T>::base& arg = typename A<T>::derived())
 {
  return 0;
 }
};

int main()
{
 A<int> a;
 a.f();
 return 0;
}

コンパイルすると、g++で次のエラーメッセージが生成されます。

test.cpp: In function 'int main()':
test.cpp:25: error: default argument for parameter of type
                    'A<int>::base&' has type 'A<int>::derived'

基本的な考え方(base-reference-type引数のデフォルト値として派生クラスを使用)は、Visual Studioでは機能しますが、g++では機能しません。コードを大学のサーバーに公開し、そこでgccでコンパイルする必要があります。私に何ができる?足りないものはありますか?

4

2 に答える 2

7

r値への(可変)参照を作成することはできません。const-referenceを使用してみてください:

 int f(const typename A<T>::base& arg = typename A<T>::derived())
//     ^^^^^

もちろんarg、const-referenceで変更することはできません。(可変)参照を使用する必要がある場合は、オーバーロードを使用してください。

 int f(base& arg) {
   ...
 }
 int f() {
   derived dummy;
   return f(dummy);
 }
于 2010-04-16T13:25:13.953 に答える
4

あなたが直面している問題は、非定数参照をとる関数へのデフォルトの引数として一時的なものを使用できないことです。一時的なものを非定数参照にバインドすることはできません。

オブジェクトを内部で変更していない場合は、署名を次のように変更できます。

int f(typename A<T>::base const & arg = typename A<T>::derived())

渡された引数を実際に変更する場合は、オプションの引数を許可するために他の手法を使用する必要があります。最も単純な方法は、デフォルトでNULLにできるポインターを使用することです。

于 2010-04-16T13:24:42.220 に答える