我有一个定义数据结构的类(我们称之为A),我想为它创建一个简单的迭代器,并带有一些基本操作(next,prev,element,valid ...)。
Iterator.h
#include "A.h"
class Iterator {
private:
A* a;
int current;
public:
Iterator(A* _a) : a(_a) { current = 0; }
};
在我的A类中,我创建了一个函数iterator(),它应该返回一个迭代器,我想到了这样的东西:
A.H
#pragma once
#include "Iterator.h"
class A {
private:
int some_data;
public:
friend class Iterator;
A(int x) : some_data(x) {}
~A();
Iterator iterator() { return Iterator{ this }; }
};
但我收到此错误:“无法使用初始化列表”初始化“Iterator”类型的临时“。我想要做的就是从A类的iterator()函数创建并返回一个Iterator对象。
注意:我在项目的单独标题中包含这些类。我使用Visual Studio。
答案 0 :(得分:0)
你有一个循环依赖。您的A.h
包含Iterator.h
,反之亦然。由于#pragma once
没有达到预期的效果,结果是编译器尝试编译
class Iterator {
private:
A* a;
int current;
public:
Iterator(A* _a) : a(_a) { current = 0; }
};
class A {
private:
int some_data;
public:
A(int x) : some_data(x) {}
~A();
Iterator iterator() { return Iterator{ this }; }
};
此操作失败,因为它在定义A
之前使用A
。它失败了,错误消息非常混乱,但你只是查看它们的 last ,而第一条错误消息至少指向问题所在。
不要让Iterator.h
包含A.h
,而是提供A
的前瞻声明:
class A;