C ++无法使用初始化列表初始化临时

时间:2017-07-08 20:03:18

标签: c++ c++11

我有一个定义数据结构的类(我们称之为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。

1 个答案:

答案 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;