C ++认为模板类'构造函数是一个具有int返回类型的函数

时间:2016-05-05 12:58:42

标签: c++ class templates

我不断收到

的编译错误
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){ }

2 个答案:

答案 0 :(得分:2)

当您转发声明模板类时,您需要包含模板部分。这样做const_iterator的前瞻声明就像

template <class Y>
class const_iterator;

// now you can use const_iterator as an incomplete type

修复了前向声明,但是构造函数的定义也存在问题。由于testconst_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文件中定义模板方法,因此只需将实现移至头文件并保持简单。