Неразрешенный внешний символ - шаблон класса [дубликат]

Возможный дубликат:

Шаблон C ++, ошибка компоновки

Я пытаюсь реализовать сортировку выбора, но получаю сообщение об ошибке (напечатано ниже). Мне кажется, что все мои включения и шаблоны сделаны правильно. Может кто-нибудь объяснить мне причину этой ошибки и общий подход к устранению ошибок такого типа. Обычно это происходит, когда есть проблемы с включением или шаблоном, но иногда это происходит в ситуации, когда я понятия не имею, что не так. Благодарю.

ошибка LNK2019: неразрешенный внешний символ "public: void __thiscall Selection :: SelectionSort (int * const, int) " (? SelectionSort @? $ Selection @ H @@ QAEXQAHH @ Z) ссылка на функцию _main

test.cpp

#include 
#include "SelectionSort.h"
using namespace std;

void main()
{
    int ar[] = {1,2,3,4,5};
    Selection s;
    s.SelectionSort(ar,5);

    for(int i = 0; i < 5; i++)
    {

        cout < "\nstudent number " < i + 1< " grade " < ar[i];
    }
}
 PiotrNycz11 окт. 2012 г., 23:39
@ DavidRodríГез-дрибас только что сделал

Ответы на вопрос(1)

Решение Вопроса

SelectionSort.cpp вSelectionSort.hчуть ниже объявления класса. Также убедитесь, что у вас есть защита заголовка вокруг всего содержимого.h файл.

Проблема заключается в том, как C ++ реализует шаблоны. Каждый раз, когда он видит новый тип, используемый с шаблоном класса (например,Selection), он воссоздает весь класс, заменяяItemType с .int

По этой причине ему необходимо знать полное определение класса (вместе с его методами) во время компиляции. Он не может просто использовать определение класса и отложить ссылку на потом.

 Zzz12 окт. 2012 г., 02:52
Я просто вспомнил, что я сделал, чтобы заставить их скомпилировать. Я добавил include guard и также включил файл реализации .cpp в тестовый драйвер. Как это меняет компиляцию, чтобы все работало?
 Zzz12 окт. 2012 г., 02:38
Спасибо за ответ. Я использовал шаблоны раньше, когда разделял свой код на файл декларации и реализации. Когда я оглядываюсь назад на эти проекты, я могуне могу найти разницу. Вы знаете, что могло сделать компиляцию предыдущего проекта?
 riwalk12 окт. 2012 г., 16:12
@ Azzi, суть в том, что компилятор должен видеть всю реализацию вашего шаблона класса во время компиляцииtest.cpp файл. Включение файла CPP работает, потому что компилятор получает доступ ко всем деталям реализации, но яМы всегда находили это более запутанным, чем оно того стоит.

Ваш ответ на вопрос