C++ 使用继承时未解析的引用

C++ 使用继承时未解析的引用,c++,templates,visual-c++,inheritance,linker-errors,C++,Templates,Visual C++,Inheritance,Linker Errors,如何将模板定义放入单独的头文件中 我的代码包含在单个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, c

如何将模板定义放入单独的头文件中

我的代码包含在单个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;
}
#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(){}
虚拟T1 f1();
虚拟t2f2();
};
模板
T1 Base::f1(){return T1();}
模板
t2base::f2(){return T2();}
派生类:公共基{
公众:
虚~Derived(){}
};
int _tmain(int argc,_TCHAR*argv[]
{
int i;
导出d;
i=d.f1();
返回0;
}
但是,当我将其分解时,会得到未解析的外部符号:

main.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;
}
#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”
#包括“派生的.h”
int _tmain(int argc,_TCHAR*argv[]
{
int i;
导出d;
i=d.f1();
返回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();}
#pragma once

class Derived : public Base<int, int> {
public:
    virtual ~Derived() {}
};
#pragma一次
模板
阶级基础{
公众:
Base();
虚拟~Base(){}
虚拟T1 f1();
虚拟t2f2();
};
模板
T1 Base::f1(){return T1();}
模板
t2base::f2(){return T2();}
派生的.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();}
#pragma once

class Derived : public Base<int, int> {
public:
    virtual ~Derived() {}
};
#pragma一次
派生类:公共基{
公众:
虚~Derived(){}
};
这导致:

错误1错误LNK2019:未解决 外部符号“public:\u thiscall” 基本::基本(无效)” (??0?$Base@HH@@QAE@XZ)引用于 函数“public:\uu thiscall” 派生::派生(无效)” (?)0导出@@QAE@XZ)


您没有为
Base
的构造函数提供实现。尝试添加

template<class T1, class T2>
Base<T1, T2>::Base () { }
模板
Base::Base(){}
或者,您可以从第二个代码段中删除它的声明。(在您的第一个代码示例中也没有)


您的链接器基本上说,
Derived::Derived()
尝试调用您明确声明的
Base::Base()
,但他找不到它的实现。

次要问题:
Derived.h
应该包括
Base.h
,因为它继承自
Base
,要求客户机按照精确的顺序包含文件是很尴尬的,因此每个头都应该是自给自足的(即编译时不包含任何内容)。