我正在尝试使用类型特征来添加对模板参数的引用。
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;实例化。
答案 0 :(得分: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"
我不知道你想要做什么。