boost add_reference不使用template参数

时间:2010-01-10 20:35:50

标签: c++ boost types traits

我正在尝试使用类型特征来添加对模板参数的引用。

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&lt;类型&gt;或S&lt;类型&安培; &GT;实例化。

1 个答案:

答案 0 :(得分:7)

你忘记了typedeftypename只表示您将使用在模板声明点处尚未称为类型的类型名称。如果您确实想要创建一个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"

我不知道你想要做什么。