为什么在C ++中会显示“找不到构造函数”?

时间:2018-07-20 07:11:13

标签: c++

#include <iostream>

using namespace std;

template <class T>
class ring {
private:
    T *m_values;
    int m_size;
    int m_index;

public:
    class iterator;

public:
    ring(int size):
            m_size(size), m_index(0), m_values(NULL) {
        m_values = new T[size];
    }

    ~ring() {
        delete [] m_values;
     }

    int size() const {
        return m_size;
    }

    iterator begin() {
        return iterator(0, *this);
    }

    iterator end() {
        return iterator(m_size, *this);
    }

    void add(T value) {
        m_values[m_index] = value;
        m_index = (m_index + 1) % m_size;
    }

    T &get(int pos) {
        return m_values[pos];
    }
};

template<class T>
class ring<T>::iterator {
private:
     int m_pos;
     ring &m_ring;
public:
    iterator(int m_pos, ring &m_ring): m_pos(m_pos), m_ring(m_ring) {};

    iterator &operator++(int) {
        m_pos++;
        return *this;
    }

    iterator &operator++() {
        m_pos++;
        return *this;
    }

    bool operator!=(const iterator &other) {
        return other.m_pos != m_pos;
    }

    T &operator*() {
        return m_ring.get(m_pos);
    }
};

这是c ++代码。我是C ++的新手,CLion的这段代码在begin()和end()函数中给我“类迭代器没有构造函数iterator(int,ring)”。有人可以给我一些暗示,为什么即使我定义了它也会发生这种情况?

顺便说一句:这是来自udemy的“学习高级C ++编程”讲座44。

更新:一些评论发现我没有定义,仅声明。这不是原因,因为我在单独的.cpp文件中定义了它。我也尝试内联定义它,但是仍然给我来自CLion的错误消息。

2 个答案:

答案 0 :(得分:5)

在此处声明构造函数

iterator(int m_pos, ring &m_ring);

但此特殊成员函数没有定义。如果您提供一个,那可能很好

iterator(int m_pos, ring &m_ring) : m_pos(m_pos), m_ring(m_ring)
{
    /* Maybe some other stuff... */
}

答案 1 :(得分:0)

声明了插入器(int,ring),但没有定义。那是问题。

声明与定义

  

声明提供符号的基本属性:符号的类型及其符号   名称。定义提供了该符号的所有详细信息-如果是   功能,它的作用;如果是一个类,它的字段和方法   已;如果是变量,则存储该变量。通常,   编译器只需要声明某些内容即可   将文件编译为目标文件,期望链接器可以找到   来自另一个文件的定义。如果没有源文件定义   符号,但已声明,链接时会出现错误   抱怨未定义的符号。

src:here