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

标签 c++ visual-c++ templates

当我将所有源代码放在一个文件中时,程序成功构建。但是,当我将它们拆分为头文件时,出现链接错误。

我的程序的主要部分: //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);
}

Queue.h 看起来像这样

#pragma once
#include <vector>

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

};

Queue.cpp 看起来像这样:

#include "Queue.h"

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

当我尝试构建它时,出现此错误:

 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

最佳答案

简短的回答是:“你不知道。”

较长的答案是:好吧,它与简短的答案基本相同。有关详细信息,请参阅 C++ FAQ Lite 条目 "Why can't I separate the definition of my templates class from its declaration and put it inside a .cpp file?"除了某些有限使用的场景(比如当你有一小部分已知的参数来使用模板并且你可以用这些类型显式地实例化它时),当你尝试使用它时,模板的定义必须是可用的.

关于c++ - 如何在 C++ 中编译位于不同文件中的模板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4869373/

相关文章:

c++ - Neon 指令,vsub_f32(a, b),是 a-b 还是 b-a?

c - 使用程序集访问数组中的元素

c++ - 什么是用于序号排序的 QT 或开源 C++ 模板

c++ - 是否可以使用带有模板化参数的特征 block 表达式作为左值?

c++ - InsertMenu/AppendMenu - 如何使用 C++ 和 win32 将图标添加到菜单和子菜单

templates - 如何从 template.FuncMap 返回 HTML 模板?

c++ - 模板类的显式初始化

c++ - 使用 stdin stdout 和 stderr 启动 exe/进程?

c++ - 专门用于指针的模板

visual-c++ - Visual C++ 中的嵌套注释?