C++ 使用继承时未解析的引用
如何将模板定义放入单独的头文件中 我的代码包含在单个main.cpp中时会编译 maip.cppC++ 使用继承时未解析的引用,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
#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
,要求客户机按照精确的顺序包含文件是很尴尬的,因此每个头都应该是自给自足的(即编译时不包含任何内容)。