比方说,我使用的是模板类中包含一些简单的:C++模板和访问命名空间
template <class T>
class MyClass
我想用从T的名称空间的元素,例如叔可能是字符串,我想用
T::const_iterator myIterator;
...或类似的东西。我如何实现这一目标? 也许它不是或者很简单,但我不知道。
感谢您的回答!
比方说,我使用的是模板类中包含一些简单的:C++模板和访问命名空间
template <class T>
class MyClass
我想用从T的名称空间的元素,例如叔可能是字符串,我想用
T::const_iterator myIterator;
...或类似的东西。我如何实现这一目标? 也许它不是或者很简单,但我不知道。
感谢您的回答!
默认情况下,如果T
是您的示例中的模板参数,则假定T::some_member
未命名类型。你必须明确指定,它是通过与typename
前缀是:
typename T::const_iterator myIterator;
这解决像下面的例子
// multiplication, or declaration of a pointer?
T::const_iterator * myIterator;
因此,一些分析问题,编译器甚至可以实例化之前解析此模板,您必须亲自动手并使用typename
,包括在不会模棱两可的情况下,例如上面的第一种情况。 Template FAQ对此有更深入的了解。
这绝对有可能。
template< typename T >
class Example
{
void foo(const T& t)
{
typedef typename T::value_type Type;
typedef typename T::const_iterator Iter;
Iter begin = t.begin();
Iter end = t.end();
std::copy(begin, end, std::ostream_iterator<Type>(std::cout));
}
};
关键是typedef的typename部分。
也谢谢你,让它成为整个班级情况的额外类型似乎是一个好主意。 – 2009-12-24 17:01:17
很好的答案,谢谢! – 2009-12-24 17:00:18
有一种情况不需要使用“typename”(并且不能):派生,例如模板 class A:T :: const_iterator {}; –
2009-12-24 18:38:31
@Benoit,对。好的音符。 – 2009-12-24 18:43:36