C++ 模板类错误 public: void __thiscall Number<int>::d isplayNumber(void)" (?displayNumber@?$Number@

C++ template class error public: void __thiscall Number<int>::displayNumber(void)" (?displayNumber@?$Number@N@@QAEXXZ) referenced in function _main

本文关键字:void isplayNumber Number@ displayNumber@ gt lt 错误 public C++ Number thiscall      更新时间:2023-10-16

我收到以下错误:

public: void __thiscall Number<int>::displayNumber(void)"
(?displayNumber@?$Number@N@@QAEXXZ) referenced in function _main
public: __thiscall Number<int>::Number<int>(int)" 
(??0?$Number@N@@QAE@N@Z) referenced in function _main

当我有如下代码时

文件名。。。。。。。。。。。。。。。。 数字.h

#ifndef NUMBER_H
#define NUMBER_H
#include<iostream>
#include<string>
using namespace std;
template <class T>
class Number
{
  private:
      T number;
  public:
      Number(T num);
      void displayNumber(void);
};

#endif

文件名。。。。。。。。。。。。。。。。。。。编号.cpp

#include<iostream>
#include<string>
#include"Number.h"
using namespace std;
template <class T>
Number<T>::Number(T num)
  {
   number = num;
  }
template <class T>
void Number<T>::displayNumber(void)
  {
   cout<<" Number is "<<number<<endl;
  }

文件名。。。。。。。。。。。 主.cpp

#include<iostream>
#include<string>
#include"Number.h"
using namespace std;

int main()
 {
  Number<int> n(10);
  n.displayNumber();
 }

但是当我剪切主代码并将其粘贴到 Number.cpp 文件中时,它运行良好。

必须将模板函数定义移动到头文件。 有关原因,请参阅此处:为什么模板只能在头文件中实现?

如果您不喜欢这样,只需将 Number.cpp 重命名为 Number.inl 或其他名称,然后将其 #include 在 Number.h 的底部。 这具有将文件内容移动到标头的效果,但仍允许您出于组织目的保留两个单独的文件。