2015-09-17 4 views
0

Я пытаюсь скомпилировать следующий код с помощью VS2010:кортежа константных ссылок: не удается преобразовать из междунар на константные <T> &

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;} 
}; 

компиляции завершается с сообщением: не удается преобразовать из «межд» до «сопзЬ CP & '. Указанный номер строки находится в объявлении кортежа в cConnection.

Я понятия не имею, почему. Что может быть причиной?

+0

Возможно, отсутствие неявного преобразования из 'int' в' const cPin & '? Ни за что. –

+3

В этой программе больше одной ошибки. Пожалуйста, исправьте все, кроме ошибки, на которую вы хотите сосредоточиться. – dyp

+2

@ набиячлевэлиь На самом деле конверсия, похоже, не является проблемой здесь вообще. OP назначает * const reference * (косвенно), который просто не будет работать. – dyp

ответ

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 (что можно сделать вывод о arugments типа), а не 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)) { 
    } 
} 
+0

спасибо Andy. S o конструктор по умолчанию пытался создать экземпляр m_data! Понимаю. Я на самом деле попытался с указателями, и он скомпилирован, вы тоже ответили на скрытый вопрос! :) –

+0

@MihaiGALOS рад помочь :) В общем, попробуйте использовать инициализаторы, когда вы можете - иначе все члены будут инициализированы дважды (один раз до значения по умолчанию, а затем снова в теле конструктора). – Andy

+0

@ dyp Я обновил свой ответ на основе ваших комментариев. Спасибо за ввод. :) – Andy

Смежные вопросы