如何编译位于C++中不同文件的模板?

unj*_*nj2 2 c++ templates visual-c++

当我将所有源都放在一个文件中时,程序就会成功构建.但是,当我将它们分成头文件时,我收到链接错误.

我的程序的主要内容://C++_Class_Templates.cpp

#include <iostream>
#include <vector>
#include "Queue.h"

using namespace std;

//Usage for C++ class templates
void main()
{
     MyQueue<int> q;
     q.Add(1);
     q.Add(2);
}
Run Code Online (Sandbox Code Playgroud)

Queue.h看起来像这样

#pragma once
#include <vector>

template <typename T>
class MyQueue
{
     std::vector<T> data; 
   public:
     void Add(T const &);
     void Remove();
     void Print();

};
Run Code Online (Sandbox Code Playgroud)

并且Queue.cpp看起来像这样:

#include "Queue.h"

template <typename T> void MyQueue<T> ::Add(T const &d)
{
     data.push_back(d);
}
Run Code Online (Sandbox Code Playgroud)

当我尝试构建它时,我收到此错误:

 1>main.obj : error LNK2019: unresolved external symbol "public: void __thiscall
 MyQueue<int>::Add(int const &)" (?Add@?$MyQueue@H@@QAEXABH@Z) referenced in function _main
Run Code Online (Sandbox Code Playgroud)

Jam*_*lis 11

简短的回答是:"你没有."

更长的答案是:嗯,它与简短答案基本相同.有关更多信息,请参阅C++ FAQ Lite条目"为什么我不能将模板类的定义与其声明分开并将其放在.cpp文件中?" 除了某些有限使用场景(例如,当您使用一小组已知参数时,您将使用该模板并且可以使用这些类型显式实例化它),当您尝试使用该模板时,模板的定义必须可用.