Странная неразрешенная внешняя компиляция DLL

Я пытаюсь следовать инструкциям на этом сайте:
http://support.microsoft.com/kb/q168958

Вот код:

#include <windows.h>
#include <malloc.h>

namespace Test {

template<class TYPE> class TestBuffer
{
private:
TYPE*   m_pData;
size_t  m_uSize;

public:
TestBuffer(size_t uSize) : m_pData(NULL), m_uSize(0)
{
m_pData = (TYPE*)malloc(uSize * sizeof(TYPE));
}

~TestBuffer() { if (NULL != m_pData) free(m_pData); }

public:
bool IsValid() const { return NULL != m_pData; }
operator TYPE*() const { return m_pData; }
};

template class __declspec(dllexport) Test::TestBuffer<wchar_t>;

__declspec(dllexport) bool GetCurrentDir(char* szDir, size_t uSize)
{
DWORD dwRequiredSize = ::GetCurrentDirectoryW(0, NULL);
Test::TestBuffer<wchar_t> wideCharBuffer(size_t(dwRequiredSize));

bool bResult = (dwRequiredSize - 1 ==
::GetCurrentDirectoryW(dwRequiredSize, (wchar_t*)wideCharBuffer));

wcstombs(szDir, (wchar_t*)wideCharBuffer, uSize);

return bResult;
}

} // namespace Test

BOOL WINAPI DllMain(HMODULE hModule, DWORD dwReason, LPVOID lpReserved)
{
char szPath[MAX_PATH] = { 0 };
Test::GetCurrentDir(szPath, MAX_PATH);

return TRUE;
}

Помещение этого в проект WIN32 DLL в VS выдает следующую ошибку:

error LNK2019: unresolved external symbol "class Test::TestBuffer<wchar_t> __cdecl wideCharBuffer(unsigned int)" (?wideCharBuffer@@YA?AV?$TestBuffer@_W@Test@@I@Z) referenced in function "bool __cdecl Test::GetCurrentDir(char *,unsigned int)"

Я не уверен, почему компоновщик не может найти определение, так как все здесь определено вместе с оператором экспорта для TestBuffer. Кроме того, в этом примере мне даже не нужно было экспортировать явное создание экземпляра TestBuffer, поскольку он не отображается в интерфейсе DLL, а только GetCurrentDir ().

Есть предположения, почему код не генерируется для TestBuffer, чтобы компоновщик мог его найти?

Постскриптум
Это надуманный пример для демонстрации проблемы, а не фактический производственный код.

1

Решение

Компилятор видит объявление wideCharBuffer как объявление функции (самый неприятный разбор). Попробуйте изменить это на:

Test::TestBuffer<wchar_t> wideCharBuffer((size_t(dwRequiredSize)));
5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]