2

テンプレートパラメータへの参照を追加するために型特性を使用しようとしています。

template < class T >
struct S {
typename add_reference< T >::type reference; // reference member should always be a reference
};
...
typedef Bar< Foo > type;
S< type > s; // does not add reference, S:: reference is of type type, not type&

ただし、機能していないようです。それは正しい方法ですか?私のコンパイラはg++4.3です。ありがとう。

明確化:S<type>またはS<type&>がインスタンス化されているかどうかに関係なく、参照メンバーを参照する必要があります。

4

1 に答える 1

7

あなたは忘れtypedefました。テンプレート宣言のtypename時点ではまだ型として知られていない型名を使用しようとしているというだけです。実際にtypedefを作成したい場合は、実際にそのキーワードを追加する必要があります。そして、以下で使用するときに、実際にタイプに名前を付けるのを忘れたと思います。

template < class T >
struct S {
  typedef typename add_reference< T >::type reference;
};
...
typedef Bar< Foo > type;
S< type >::reference s = some_foo; // initialize!

参照を初期化することを忘れないでください。参照ではないことが事前にわかっている場合T(参照間の問題を回避するため)、これを直接行うこともできます。

template < class T >
struct S {
  typedef T &reference;
};

typedef Bar< Foo > type;
S< type >::reference s = some_bar_foo; // initialize!

あなたがしたいことが参照データメンバーを作成することであるならば、あなたの構文typedefは正しくありませんでした

template < class T >
struct S {
  typename add_reference< T >::type reference;
};
...
typedef Bar< Foo > type;
S< type > s = { some_bar_foo }; // initialize!
s.reference = some_other_bar_foo; // assign "some_other_bar_foo" to "some_bar_foo"

あなたが何をしたいのか正確にはわかりません。

于 2010-01-10T20:44:19.920 に答える