передать перечисление в функцию в c ++ - PullRequest
0 голосов
/ 02 апреля 2012

Я действительно не понимаю, как передать тип enum в функцию в c ++. Я ищу и проверяю все представленные решения, но ни одно из них не решает мою проблему. в SocketInfo.h, у меня есть enum с именем SocketType, который объявлен глобально как:

    typedef enum SocketTypeEnum
{
    SOCKET_TYPE_IPSEC
} SocketType;

в SocketInfo.h у меня есть класс с именем SocketInfo:

class SocketInfo
{
public:
    SocketInfo(const char* ip,unsigned short fd,SocketType stype);
}

в SocketInfo.cpp:

SocketInfo::SocketInfo(const char* ip, unsigned short fd,SocketType stype)
{
    //some work done here
}

я создаю этот класс без ошибок

Теперь для тестирования этого класса я создаю консольное приложение win32. В _tmain я пишу этот код

#include "SocketInfo.h"

void Test_Socket()
{
    SocketInfo* si = new SocketInfo(NULL,5060,SOCKET_TYPE_IPSEC);
}

int _tmain(int argc, _TCHAR* argv[])
{
    Test_Socket();
    getch();
    return 0;
}

после выполнения кода выше я получил эти ошибки:

Ошибка 4, ошибка LNK2019: неразрешенный внешний символ "public: __thiscall SocketInfo :: SocketInfo (char const *, unsigned short, enum SocketTypeEnum)" (?? 0SocketInfo @@ QAE @ PBDGW4SocketTypeEnum @@@ Z) referenced функция "void __cdecl Test_Socket (void)" (? Test_Socket @@ YAXXZ)

Ошибка 5 Ошибка LNK1120: 1 неразрешенный внешний вид

как я могу решить эти ошибки.

все коды компилируются в visual studio 2010 Ultimate.

1 Ответ

2 голосов
/ 02 апреля 2012

Проблема не в том, как вы передаете enum в качестве параметра, что нормально, но в том, что вы не экспортируете символы из своего проекта и не импортируете их в свой тестовый проект.

Вам необходимо добавить файл lib, сгенерированный проектом и определяющий SocketInfo, к дополнительным зависимостям тестового проекта.

Вам также необходимо экспортировать класс:

_declspec(dllexport) class SocketInfo
{
public:
    SocketInfo(const char* ip,unsigned short fd,SocketType stype);
};

и импортируйте его в тестовый проект с _declspec(dllimport). Эта двойственность обычно достигается с помощью макросов - посмотрите.

...