Я пытаюсь понять следующую ошибку, которую g ++ выдавал при попытке связать мой код. Обсуждаемая ошибка компоновки:
ClassA.cpp:17: undefined reference to `ClassA::xOffset'
ClassA.cpp:17: undefined reference to `ClassA::yOffset'
Эта ошибка происходит из этой строки
ClassA::ClassA(int width, int height) : m_width(width - 2 * xOffset),
m_height(height - 2 * yOffset),
---> error here m_classB(50, 300,std::make_tuple(xOffset + m_width, xOffset), std::make_tuple(yOffset + m_height, yOffset))
Ошибка, в частности, связана с созданием кортежей и ссылкой на xOffset и yOffset ввторая запись в каждом вызове make_tuple.
Глядя на другие вопросы по SO, я заметил, что люди сталкиваются с той же проблемой, когда не назначают свои статические переменные-члены. Однако вот мое определение класса.
class ClassA {
public:
ClassA(int width, int height);
.....
private:
static const int xOffset = 150;
static const int yOffset = 300;
int m_width;
int m_height;
ClassB m_classB;
....
};
Там, где инициализируются и xOffset, и yOffset.
Как ни странно, после игры с ошибкой я могу устранить ошибку компоновки, изменив строку инициализации на эту
ClassA::ClassA(int width, int height) : m_width(width - 2 * xOffset),
m_height(height - 2 * yOffset),
m_classB(50, 300,std::make_tuple(xOffset + m_width, xOffset + 0), std::make_tuple(yOffset + m_height, yOffset + 0))
Где единственное изменение - это добавление 0 к xOffset и yOffset. Это устраняет ошибку компоновки и позволяет мне компилировать и запускать мой код.
Мой вопрос заключается в том, почему добавление + 0 исправляет ошибку компоновки и почему я могу ссылаться на статические переменные xOffset и yOffset в списке инициализации, когдасоздание m_width и m_height, но повторение этого в следующем элементе списка инициализации вызывает ошибку компоновщика?