模板中的方法:一个工作,一个不实例化 [英] methods in template: one works, one does not instantiate
本文介绍了模板中的方法:一个工作,一个不实例化的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
template< class T,int MAXSIZE>
/ pre>
class svector {
public:
typedef T value_type;
class iterator:public std :: iterator< std :: input_iterator_tag,T> {
// ...
};
// ...
svector :: iterator insert(svector :: iterator position,const T& val);
void insert(svector :: iterator position,size_t n,const T& val);
svector :: iterator erase(svector :: iterator position);
svector :: iterator erase(svector :: iterator first,svector :: iterator last);
// ...
};
template< class T,int MAXSIZE>
class svector< T,MAXSIZE> :: iterator svector< T,MAXSIZE> :: insert(class svector:: iterator position,const T& val){
insert 1,val);
return position;
}
template< class T,int MAXSIZE>
void svector< T,MAXSIZE> :: insert(class svector< T,MAXSIZE> :: iterator position,size_t n,const T& val){
// ...
}
template< class T,int MAXSIZE>
class svector< T,MAXSIZE> :: iterator擦除(类svectorreturn erase(position,position); //(1)
}
template< class T,int MAXSIZE>
class svector< T,MAXSIZE> :: iterator擦除(类svectorclass svector< T,MAXSIZE> :: iterator last){
// ..
}
已经测试了
insert
方法。但是非常类似的erase
方法
不愿意,我不明白为什么。这是一个UT代码片段:typedef class util :: svector< int,10> vecIntX;
vecIntX v1;
for(int e = 0; e <10; e ++)v1.push_back(e);
vecIntX :: iterator it = v1.begin();
v1.erase(it) //(2)
Eclipse在第(1)行抱怨:
无效的参数,候选项是?erase(?),?erase(?,?)
在第(2)行链接期间出错:
未定义引用'util :: svector< int,10> :: erase(util :: svector< int,10&:: :: iterator)'
解决方案您需要在方法定义前添加类名:
template< class T,int MAXSIZE>
class svector {...};
template< class T,int MAXSIZE>
class svector& MAXSIZE> :: iterator svector< T,MAXSIZE> :: erase(
class svector< T,MAXSIZE> :: iterator position){...}
当你在类中外部的方法。
template <class T, int MAXSIZE> class svector { public: typedef T value_type; class iterator : public std::iterator<std::input_iterator_tag,T> { // ... }; // ... svector::iterator insert( svector::iterator position, const T& val ); void insert( svector::iterator position, size_t n, const T& val ); svector::iterator erase( svector::iterator position ); svector::iterator erase( svector::iterator first, svector::iterator last ); // ... }; template <class T, int MAXSIZE> class svector<T,MAXSIZE>::iterator svector<T,MAXSIZE>::insert (class svector<T,MAXSIZE>::iterator position, const T& val){ insert( position, 1, val ); return position; } template <class T, int MAXSIZE> void svector<T,MAXSIZE>::insert (class svector<T,MAXSIZE>::iterator position, size_t n, const T& val){ // ... } template <class T, int MAXSIZE> class svector<T,MAXSIZE>::iterator ??????????????????????????????erase (class svector<T,MAXSIZE>::iterator position){ return erase( position, position ); // (1) } template <class T, int MAXSIZE> class svector<T,MAXSIZE>::iterator ??????????????????????????????erase (class svector<T,MAXSIZE>::iterator first, class svector<T,MAXSIZE>::iterator last) { // .. }
The
insert
methods have been tested. But the very similarerase
methods are unwilling, and I fail to see why. Here's a UT-snippet:typedef class util::svector<int, 10> vecIntX; vecIntX v1; for( int e = 0; e < 10; e++ ) v1.push_back( e ); vecIntX::iterator it = v1.begin(); v1.erase( it ); // (2)
Eclipse complains at line (1):
"Invalid arguments, candidates are ? erase(?), ? erase(?,?)
Error during linking at line (2):
undefined reference to 'util::svector<int, 10>::erase(util::svector<int, 10>::iterator)'
解决方案You need to prefix the method definitions with the class name:
template <class T, int MAXSIZE> class svector { ... }; template <class T, int MAXSIZE> class svector<T,MAXSIZE>::iterator svector<T,MAXSIZE>::erase( class svector<T,MAXSIZE>::iterator position){ ... }
when you inline the methods outside of the class.
这篇关于模板中的方法:一个工作,一个不实例化的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文