const引用的元组:不能从int转换为const <t>&amp;

时间:2015-09-17 16:40:56

标签: c++

我正在尝试使用VS2010编译以下代码:

typedef enum EPinDirection{
    EPinDirection_Unknown,
    EPinDirection_In,
    EPinDirection_Out
};

class cPin{
    std::tuple<QString,EPinDirection> m_nameDir;

public:
    cPin(){ m_nameDir = std::tuple<QString, EPinDirection>("noNamePin", EPinDirection_Unknown);}
    cPin(QString name, EPinDirection dir) { m_nameDir = std::tuple<QString, EPinDirection>(name, dir); }
    const std::tuple<QString,EPinDirection>& getNameDir() const {return m_nameDir;};
};

class cConnection{
    std::tuple<const cPin&,const cPin&> m_data;

public :
    cConnection();
    cConnection(const cPin& start, const cPin& stop) {m_data = std::tuple<const cPin&, const cPin&>(start, stop);}

    int setData(const cPin& start, const cPin& stop) {m_data = std::tuple<const cPin&, const cPin&>(start, stop);}
    const std::tuple<const cPin&,const  cPin&> & getData() const {return m_data;}
};

编译失败并显示消息:无法从'int'转换为'const cPin&amp;'。指示的行号是cConnection中元组的声明。

我不知道为什么。可能是什么原因?

1 个答案:

答案 0 :(得分:2)

编译错误是由于编译器尝试使用默认值初始化cConnection::m_data。由于元组需要两个const引用,因此无法执行此操作,因此会生成错误。

您可以通过删除cConnection的默认构造函数并更改剩余的构造函数来使用初始值设定项来解决此问题:

class cConnection {
    std::tuple<const cPin&, const cPin&> m_data;

public:
    cConnection(const cPin& start, const cPin& stop)
      : m_data(std::tuple<const cPin&, const cPin&>(start, stop)) {
    }
}

(您也可以通过将元组更改为指针而不是引用来解决此问题,但在程序的上下文中这可能没有意义。)

如果您想进一步简化代码,请考虑使用std::make_tuple(可以推断类型的句子)而不是tuple构造函数:

class cConnection {
    std::tuple<const cPin&, const cPin&> m_data;

public:
    cConnection(const cPin& start, const cPin& stop)
      : m_data(std::make_tuple(start, stop)) {
    }
}