2014-02-22 36 views
1
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)' 
+0

@Patatoswatter原文很好。 Eclipse在第(1)行抱怨,但另一个错误来自ld。 – laune

+0

对不起,那一点不清楚。我编辑是因为缺少代码格式化会擦除尖括号之间的所有内容。随意再次编辑,但请检查预览(一如既往)。 – Potatoswatter

回答

1

您需要前缀的方法定义与类名称:

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

当你在班级以外的方法内联。

+0

是的,发布后我也看到了。我的老眼睛周围装饰太多。 – laune

+0

@laune也在方法参数中,您不需要以类型作为前缀。如''模板<...>类svector <...> ::迭代器svector <...> ::擦除(迭代器位置){...}'。干杯。 – mockinterface

+0

Woops,别管我以前的评论。这是'class'关键字的有效用法。 – Potatoswatter

相关问题