Неразрешенная ссылка при использовании наследования - PullRequest
2 голосов
/ 23 ноября 2010

Как я могу получить определение шаблона в отдельных заголовочных файлах?

Мой код компилируется, когда он включен в один файл main.cpp.

maip.cpp

#include <windows.h>
#include <tchar.h>

template<class T1, class T2>
class Base {
public:
    virtual ~Base() {}
    virtual T1 f1();
    virtual T2 f2();
};

template<class T1, class T2>
T1 Base<T1, T2>::f1() {return T1();}
template<class T1, class T2>
T2 Base<T1, T2>::f2() {return T2();}

class Derived : public Base<int, int> {
public:
    virtual ~Derived() {}
};

int _tmain(int argc, _TCHAR* argv[])
{
    int i;
    Derived d;
    i = d.f1();
    return 0;
}

Однако, когда я разбиваю его, я получаю неразрешенные внешние символы:

main.cpp

#include <windows.h>
#include <tchar.h>

#include "Base.h"
#include "Derived.h"

int _tmain(int argc, _TCHAR* argv[])
{
    int i;
    Derived d;
    i = d.f1();
    return 0;
}

Base.h

#pragma once

template<class T1, class T2>
class Base {
public:
    Base();
    virtual ~Base() {}
    virtual T1 f1();
    virtual T2 f2();
};

template<class T1, class T2>
T1 Base<T1, T2>::f1() {return T1();}
template<class T1, class T2>
T2 Base<T1, T2>::f2() {return T2();}

Derived.h

#pragma once

class Derived : public Base<int, int> {
public:
    virtual ~Derived() {}
};

В результате:

Ошибка 1, ошибка LNK2019: неразрешенный внешний символ «public: __thiscall Base :: Base (void)» (?? 0? $ Base @ HH @@ QAE @ XZ), на который ссылается функция «public: __thiscall Derived :: Derived (void)» (?? 0Derived@@ QAE @ XZ)

1 Ответ

5 голосов
/ 23 ноября 2010

Вы не предоставили реализацию для конструктора Base.Попробуйте добавить

template<class T1, class T2>
Base<T1, T2>::Base () { }

Кроме того, вы можете удалить его объявление из вашего второго фрагмента кода.(Он также отсутствует в вашем первом примере кода).

Ваш компоновщик в основном говорит, что Derived::Derived () пытается вызвать Base::Base (), который вы явно объявили, но он не может найти реализацию для него.

...