Jör*_*chs 3 c++ templates namespaces class
假设我正在使用模板化的类,其中包含以下内容:
template <class T>
class MyClass
Run Code Online (Sandbox Code Playgroud)
我想使用T的命名空间中的元素,例如T可以是字符串,我想使用
T::const_iterator myIterator;
Run Code Online (Sandbox Code Playgroud)
...或类似的东西.我如何实现这一目标?可能,它要么不可能,要么非常简单,但我不知道.
谢谢你的回答!
Joh*_*itb 12
默认情况下,如果T是示例中的模板参数,T::some_member则假定不命名类型.您必须通过为其添加前缀来明确指定它typename:
typename T::const_iterator myIterator;
Run Code Online (Sandbox Code Playgroud)
这解决了一些解析问题,如下例所示
// multiplication, or declaration of a pointer?
T::const_iterator * myIterator;
Run Code Online (Sandbox Code Playgroud)
因此编译器甚至可以在实例化模板之前对其进行解析,您必须手动使用typename,包括那些不会模糊的情况,就像上面的第一种情况一样.该模板常见问题有更深入地了解这一点.
这绝对是可能的.
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) );
}
};
Run Code Online (Sandbox Code Playgroud)
关键是typedef的typename部分.