模板中的方法:一个工作,一个不实例化 [英] methods in template: one works, one does not instantiate

查看:127
本文介绍了模板中的方法:一个工作,一个不实例化的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

  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 :: 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擦除(类svector return erase(position,position); //(1)
}

template< class T,int MAXSIZE>
class svector< T,MAXSIZE> :: iterator擦除(类svector class svector< T,MAXSIZE> :: iterator last){
// ..
}
/ pre>

已经测试了 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 similar erase 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆