我不断收到
的编译错误error: non-template type ‘const_iterator’ used as a template
In function ‘int const_iterator()’:
error: only constructors take base initializers
warning: no return statement in function returning non-void
但是,我有const_iterator作为构造函数。
删除了其他内容的相关代码:
.h文件:
template <class T>
class test {
public:
// Forward declaration
class const_iterator;
template <class Y>
class const_iterator{
public:
template<class A> friend class test;
// Default constructor
const_iterator();
private:
Y* current;
};
};
.cpp文件:
// Default constructor
template <class T>
test<T>::const_iterator<T>::const_iterator() : m_current(NULL){ }
答案 0 :(得分:2)
当您转发声明模板类时,您需要包含模板部分。这样做const_iterator
的前瞻声明就像
template <class Y>
class const_iterator;
// now you can use const_iterator as an incomplete type
修复了前向声明,但是构造函数的定义也存在问题。由于test
和const_iterator
都是模板,因此在定义构造函数时需要两个单独的模板。每个人一个。看起来像是
template <class T> // for test
template <class Y> // for const_iterator
test<T>::const_iterator<Y>::const_iterator() : current(nullptr){ }
当您在.h和.cpp文件之间分离模板类时,您还会遇到另一个问题。你不能用模板做到这一点。有关该主题的更多信息,请参阅:Why can templates only be implemented in the header file?
答案 1 :(得分:0)
如果您希望实际使用它们,则无法在.cpp文件中定义模板方法,因此只需将实现移至头文件并保持简单。