Как скомпилировать шаблоны, расположенные в разных файлах в C ++? - PullRequest
2 голосов
/ 02 февраля 2011

Когда я помещаю все исходники в один файл, программа успешно собирается. Однако, когда я разделяю их на заголовочные файлы, я получаю ошибку ссылки.

Основная моя программа: //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

Ответы [ 2 ]

11 голосов
/ 02 февраля 2011

Короткий ответ: «Вы не делаете».

Более длинный ответ: ну, в общем, он такой же, как короткий ответ. Для получения дополнительной информации см. Статью C ++ FAQ Lite «Почему я не могу отделить определение своего класса шаблонов от его объявления и поместить его в файл .cpp?» За исключением определенных сценариев ограниченного использования например, когда у вас есть небольшой набор известных аргументов, с которыми вы будете использовать шаблон, и вы можете явно создать его экземпляр для этих типов), определение шаблона должно быть доступно, когда вы пытаетесь его использовать.

1 голос
/ 02 февраля 2011

Разделение объявлений и определений для шаблонов не тривиально.

Компилятор должен видеть определение, чтобы иметь возможность компилировать специализацию, но он также должен знать параметры для использования. C ++ был спроектирован так, чтобы компилировать по одной «единице компиляции» за раз, и эти две части (определение и параметры) должны быть видны одновременно.

Таким образом, вы либо помещаете весь список всех необходимых вам специализаций в файл реализации шаблона, либо вы помещаете полное определение в файл .h. Однако оба эти решения имеют свои недостатки.

См. этот ответ о той же проблеме, с которой вы столкнулись, для более полного объяснения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...