模板中的方法:一个有效,一个不实例化

methods in template: one works, one does not instantiate

本文关键字:一个 有效 实例化 方法      更新时间:2023-10-16
 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) {
     // ..
 }

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)行抱怨:

"Invalid arguments, candidates are ? erase(?), ? erase(?,?)

在第 (2) 行链接时出错:

undefined reference to 'util::svector<int, 10>::erase(util::svector<int, 10>::iterator)'

您需要在方法定义前面加上类名:

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){ ... }

当您在类外部内联方法时。