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文件中?" 除了某些有限使用场景(例如,当您使用一小组已知参数时,您将使用该模板并且可以使用这些类型显式实例化它),当您尝试使用该模板时,模板的定义必须可用.