Debug:模板类在.h、.cpp文件中实现的报错[无法识别标识符]

为什么会出现这种错误?

先了解一下情景:

//temp.h
#pragma once
template<class T>
class temp{
    void Print();
}

//temp.cpp
#include"temp.h"

template<class T>
void temp<T>::Print(){
           std::cout<<" Creat "<<std::endl;
}

报错:LNK2001:无法解析的外部符号

可以看到,我们在temp.h中进行了类的声明,在temp.cpp中进行了方法的实现,这对于一般的类来说这是一个平常的实现方法,但对于模板类来说,情况就不一样了,因为模板类的只有在确定未知类参数时,系统才会给他分配空间,而在编译时,通过分文件实现一个类,会多出一个对接函数地址的步骤,对于一般的类,我们在分文件实现时.h和.cpp文件都会编译出对应的机械码,编译器只需要将其函数接口对接就行了,但对于模板类来说,实现文件中的代码是不会被编译机械码的,所以当编译器是找不到函数接口,只能报错LNK2001了。

解决办法

这里推荐一个个人觉得最好用的;

我们只需要在使用文件中包含实现文件和声明文件即可,这样就可以绕过对接函数地址的步骤了[因为实现和声明都在同一个文件当中,编译器就不会跨文件寻那虚无缥缈的地址了]

//temp.h
#pragma once
template<class T>
class temp{
    void Print();
}

//temp.cpp
#include"temp.h"

template<class T>
void temp<T>::Print(){
           std::cout<<" Creat "<<std::endl;
}

//use.cpp

#include"temp.h"
#include"temp.cpp"

int main(){
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当我们需要将模板类的定义和实现分离到不同的文件时,可以将模板类的声明放在一个头文件,将模板类实现放在一个cpp文件。 假设我们有一个模板类`MyClass`的声明: ```c++ // MyClass.h #pragma once template<typename T> class MyClass { public: MyClass(T value); void printValue(); private: T m_value; }; ``` 在模板类的定义,我们只需要声明构造函数和`printValue`函数的方法,而不需要提供函数的具体实现,因为这些实现将在另一个文件提供。 现在我们需要在一个cpp文件提供模板类实现: ```c++ // MyClass.cpp #include "MyClass.h" #include <iostream> template<typename T> MyClass<T>::MyClass(T value) : m_value(value) {} template<typename T> void MyClass<T>::printValue() { std::cout << "Value: " << m_value << std::endl; } // 显式实例化模板类 template class MyClass<int>; template class MyClass<float>; ``` 在这个文件,我们提供了模板类实现,包括构造函数和`printValue`函数的具体代码。此外,我们还需要显式实例化模板类,这将在编译时生成模板类的实例化代码。在这个例子,我们实例化了`MyClass<int>`和`MyClass<float>`两个类型的模板类。 最后,在需要使用模板类文件,只需要包含头文件即可: ```c++ // main.cpp #include "MyClass.h" int main() { MyClass<int> obj(42); obj.printValue(); return 0; } ``` 在这个例子,我们实例化了一个`MyClass<int>`类型的对象,并调用了它的`printValue`函数。编译器将在编译时生成实例化的代码,并将其链接到最终的可执行文件

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值