#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的错误消息。
答案 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