Ошибки связывания пользовательских классов шаблона CMDIChildWndEx - PullRequest
0 голосов
/ 27 сентября 2011

Хорошо, я определил класс шаблона, который компилируется, как и ожидалось, когда я реализую этот класс в функции CMainFrame приложения и скомпилирую его, я получаю неразрешенные ошибки компоновки.

void CMainFrame::OnFunc()
{
    CTestList<CMyClass> list;
}

Ошибки компоновки:

1>mainfrm.obj : error LNK2019: unresolved external symbol "public: virtual __thiscall CTestList<class CMyClass>::~CTestList<class CMyClass>(void)" (??1?$CTestList@VCWnd@@@@UAE@XZ) referenced in function "protected: void __thiscall CMainFrame::OnFunc(void)" (?OnFunc@CMainFrame@@IAEXXZ)
1>mainfrm.obj : error LNK2019: unresolved external symbol "public: __thiscall CTestList<class CMyClass>::CTestList<class CMyClass>(void)" (??0?$CTestList@VCWnd@@@@QAE@XZ) referenced in function "protected: void __thiscall CMainFrame::OnFunc(void)" (?OnFunc@CMainFrame@@IAEXXZ)

Я проверил все очевидные пропущенные заголовки, неопределенные функции и т. Д., Но все равно выдает эти ошибки мне, все файлы являются частью основного приложения и не находятся вstatic / shared libs, так как это ошибка, которую я ожидал бы, если бы сделал это ..

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

Действительно нужно получить этот прибитый как можно скорее, так что если вы, ребята и девушки, могли бы помочь, я был бы очень признателен.

Ура, DIGGIDY

/////////////////////////////////////////////////////////////////////////////
// CTestList class

template <class T>
class CTestList : public CMDIChildWndEx
{
    //DECLARE_DYNAMIC(CTestList<T>)
public:
    CTestList();
    virtual ~CTestList();

protected:
    // Generated message map functions
    afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
    DECLARE_MESSAGE_MAP()
};

/////////////////////////////////////////////////////////////////////////////
// CTestList

//IMPLEMENT_DYNCREATE(CTestList<SDCM_OBJECT_TYPE>, CMDIChildWndEx)

template <class T>
CTestList<T>::CTestList()
{
}

template <class T>
CTestList<T>::~CTestList()
{
}

BEGIN_TEMPLATE_MESSAGE_MAP(CTestList, T, CMDIChildWndEx)
    ON_WM_CREATE()
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTestList message handlers

template <class T>
int CTestList<T>::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
    if ( CMDIChildWndEx::OnCreate(lpCreateStruct) == -1 )
        return -1;

    // this removes the crappy un-drawn client edge on screen
    ModifyStyleEx(WS_EX_OVERLAPPEDWINDOW, WS_EX_WINDOWEDGE);

    return 0;
}

1 Ответ

0 голосов
/ 28 сентября 2011

Код вашего шаблона не указывается в заголовочном файле.Когда компилируется файл шаблона класса cpp, компилятор не знает, какие экземпляры T потребуются.Когда ваш основной файл компилируется и вам нужно создать экземпляр CTestList, компилятор имеет только файл заголовка шаблона.Вам нужно добавить принудительное создание экземпляра шаблона в ваш файл .cpp шаблона - поэтому в момент компиляции он сгенерирует правильное создание экземпляра CMyClass шаблона.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...