VS2015 C ++ LNK2019 ошибка при использовании общего перечисления в отдельном заголовочном файле - PullRequest
0 голосов
/ 22 марта 2020

В основном я хочу разделить перечисление между различными классами. Разделение перечисления в его собственном заголовочном файле с безымянным пространством имен работает нормально, если один из классов не использует перечисление в качестве возвращаемого типа для функции.

Следующий пример не скомпилируется, он приведет к ошибке компилятора:

Test.obj : error LNK2019: unresolved external symbol "public: enum `anonymous namespace'::SharedEnum __thiscall ExampleClass::getEnum(void)" (?getEnum@ExampleClass@@QAE?AW4SharedEnum@?A0xe6c5ebe7@@XZ) referenced in function _main

Как только вы не вернете тип SharedEnum из ExampleClass, а просто целое число, например, все скомпилируется нормально. Мне бы очень хотелось понять, почему это происходит, и каков наилучший подход к распределению перечислений или переменных между классами без ошибок компоновщика.

Любая помощь очень ценится!

Тест. cpp

#include "stdafx.h"
#include "SharedEnum.h"
#include "ExampleClass.h"

SharedEnum mainEnum;

int main()
{
    mainEnum = VALUE_1;

    ExampleClass* exampleClass = new ExampleClass();
    SharedEnum exampleEnum = exampleClass->getEnum();

    return 0;
}

SharedEnum.h

#pragma once

namespace {

    enum SharedEnum {
        VALUE_1,
        VALUE_2,
        VALUE_3
    };
}

ExampleClass.h

#pragma once

#include "SharedEnum.h"

class ExampleClass
{
public:
    ExampleClass();
    ~ExampleClass();

    SharedEnum getEnum();

private:
    SharedEnum myEnum;
};

ExampleClass. cpp

#include "stdafx.h"
#include "ExampleClass.h"

ExampleClass::ExampleClass()
{
    myEnum = VALUE_2;
}

ExampleClass::~ExampleClass()
{
}

SharedEnum ExampleClass::getEnum()
{
    return myEnum;
}
...