Проще говоря:
У меня есть класс, который состоит в основном из статических общедоступных членов, поэтому я могу сгруппировать вместе похожие функции, которые по-прежнему необходимо вызывать из других классов / функций.
В любом случае, я определил две статические переменные типа unsigned char в своей публичной области видимости класса, когда я пытаюсь изменить эти значения в конструкторе того же класса, я получаю ошибку «неразрешенный внешний символ» при компиляции.
class test
{
public:
static unsigned char X;
static unsigned char Y;
...
test();
};
test::test()
{
X = 1;
Y = 2;
}
Я новичок в C ++, так что не беспокойтесь. Почему я не могу этого сделать?
Объявления статических элементов данных в объявлении класса не являются их определением. Чтобы определить их, вы должны сделать это в
.CPP
файле, чтобы избежать дублирования символов.Единственные данные, которые вы можете объявлять и определять, - это интегральные статические константы. (Значения
enums
могут также использоваться как постоянные значения)Возможно, вы захотите переписать свой код как:
Если вы хотите иметь возможность изменять свои статические переменные (другими словами, когда неуместно объявлять их как const), вы можете разделить свой код между
.H
и.CPP
следующим образом:.H:
.CPP:
источник
Поскольку это первый поток SO, который, казалось, возник у меня при поиске «неразрешенных внешних элементов со статическими константными членами» в целом, я оставлю здесь еще одну подсказку для решения одной проблемы с неразрешенными внешними элементами:
Что касается меня, то я забыл отметить определение моего класса
__declspec(dllexport)
, и при вызове из другого класса (за пределами границ этого класса) я, конечно, получил мою неразрешенную внешнюю ошибку.Тем не менее, легко забыть, когда вы меняете внутренний вспомогательный класс на класс, доступный из другого места, поэтому, если вы работаете в динамически связанном проекте, вы также можете проверить это.
источник
в моем случае я объявил одну статическую переменную в файле .h, например
и в myClass.cpp я попытался использовать эту m_nMyVar. Получена ошибка LINK, например:
ошибка LNK2001: неразрешенный внешний символ "public: static class ... Файл cpp, связанный с ошибкой ссылки, выглядит так:
Поэтому я добавляю код ниже поверх myClass.cpp
тогда LNK2001 исчезнет.
источник
В моем случае я использовал неправильную привязку.
Это управлялось c ++ (cli), но с собственным экспортом. Я добавил в компоновщик -> ввод -> ресурс ссылки сборки dll библиотеки, из которой экспортируется функция. Но для встроенного связывания c ++ требуется файл .lib, чтобы правильно «видеть» реализации в cpp, поэтому мне помогло добавить файл .lib в компоновщик -> ввод -> дополнительные зависимости.
[Обычно управляемый код не использует экспорт и импорт dll, он использует ссылки, но это была уникальная ситуация.]
источник