2014-04-30 7 views
-1

Итак, эта часть кода является небольшой частью большого проекта. Я не могу скопировать весь проект, но на самом деле это всего лишь две строки, делающие ошибку. Я пытаюсь получить доступ к функции mergeSort из класса Metrics. Метрики - это другой класс, чем тот, к которому я пытаюсь получить доступ. Я определил mergeSort, а также #included Metrics в классе, с которым я работаю. Я также определил конструктор. Вот кусок кода:C++ LNK 2019 Ошибка с шаблонами/классами

void Document::createHashWords() 
{ 
    Node* heads[97]; 

    string* allWords = parseWords(); 
    int numWords = getdWordCt(); 

    for (int i = 0; i < numWords; i++) 
    { 
     char* word = (char*)allWords[i].c_str(); 
     int k = hashWord(word,97); 
     insertWord(heads,k,allWords[i]); 
    } 

    for (int i = 0; i < 97; i++) 
    { 
     Node* temp = heads[i]; 
     int size = 0; 

     while (temp != NULL) 
     { 
      size++; 
      temp = temp->getNext(); 
     } 

     int* countArr = new int[size]; 
     temp = heads[i]; 

     for (int i = 0; i < size; i++) 
     { 
      countArr[i] = temp->getCount(); 
      temp = temp->getNext(); 
     } 

     Metrics <int> toSort; 
     toSort.mergeSort(countArr,size); 

    } 
} 

Кодекс, что является причиной этой проблемы является последним 2: Metrics toSort и toSort.mergeSort (countArr, размер) ;.

Вот класс Метрики:

template <class T> 
class Metrics 
{ 
private: 
    int id; 
public: 
    Metrics(); 
    ~Metrics(); 
    void selectionSort(T *arr, int n); 
    void insertionSort(T *arr, int n); 
    void merge(T *a, int numA, T *b, int numB, T *c); 
    void mergeSort(T *arr, int n); 
}; 

Я определил в слияние файле .cpp для этого класса.

Вот моя ошибка сборки:

1>Document.obj : error LNK2019: unresolved external symbol "public: __thiscall Metrics<int>::Metrics<int>(void)" ([email protected]@@[email protected]) referenced in function "public: void __thiscall Document::createHashWords(void)" ([email protected]@@QAEXXZ) 
1>Document.obj : error LNK2019: unresolved external symbol "public: __thiscall Metrics<int>::~Metrics<int>(void)" ([email protected]@@[email protected]) referenced in function "public: void __thiscall Document::createHashWords(void)" ([email protected]@@QAEXXZ) 
1>Document.obj : error LNK2019: unresolved external symbol "public: void __thiscall Metrics<int>::mergeSort(int *,int)" ([email protected][email protected]@@[email protected]) referenced in function "public: void __thiscall Document::createHashWords(void)" ([email protected]@@QAEXXZ) 
1>C:\Users\Kevin\Documents\Visual Studio 2012\Projects\CMPSC 122 Checkpoint 2\Debug\CMPSC 122 Checkpoint 1.exe : fatal error LNK1120: 3 unresolved externals 

Если удалить эти 2 строки, я могу составить штраф. Я просто не знаю, почему эти две строки ошибаются. Мне нужно получить доступ к этой функции из класса Metrics.

template <class T> 
    class Metrics 
    { 
    private: 
     int id; 
    public: 
     Metrics<T>() {} 
     ~Metrics<T>() {} 
     void selectionSort(T *arr, int n); 
     void insertionSort(T *arr, int n); 
     void merge(T *a, int numA, T *b, int numB, T *c); 
     void mergeSort(T *arr, int n); 
    }; 

Так что это теперь мой Метрики класс:

template <class T> 
    class Metrics 
    { 
    private: 
     int id; 
    public: 
     Metrics() {} 
     ~Metrics() {} 
     void selectionSort(T *arr, int n); 
     void insertionSort(T *arr, int n); 
     void merge(T *a, int numA, T *b, int numB, T *c); 
     void mergeSort(T *arr, int n); 
    }; 

Я закомментирована определения конструктора/деструктора в Metrics.cpp файл следующим образом:

//template <class T> 
    //Metrics<T>::Metrics() 
    //{ 
    //} 

    //template <class T> 
    //Metrics<T>::~Metrics() 
    //{ 

    //} 

И теперь это мой код ошибки:

1> Document.obj: ошибка LNK2019: неразрешенный внешний символ "public: v oid __thiscall Метрики :: mergeSort (int *, int) "(? mergeSort @? $ Metrics @ H @@ QAEXPAHH @ Z), на которые ссылается функция« public: void __thiscall Document :: createHashWords (void) »(? createHashWords @ Document @ @QAEXXZ) 1> C: \ Users \ Kevin \ Documents \ Visual Studio 2012 \ Projects \ CMPSC 122 Checkpoint 2 \ Debug \ CMPSC 122 Checkpoint 1.exe: фатальная ошибка LNK1120: 1 неразрешенных внешних

+0

Вам не нужно '' в классе. Так что просто «Метрики»() {} 'и т. Д. – kec

+0

Я так и делал это сейчас. Я добавил, что мой текущий класс метрик – user3421510

+0

И теперь ваши ошибки разные. У вас, вероятно, такая же проблема с другими функциями. – kec

ответ

0

недостающий символ кажется чтобы быть меткой по умолчанию для Metrics, той, которая не принимает аргументов. Вы определили его? Вам нужно как-то включить его в ту же единицу перевода. Обычным способом было бы определить его в файле заголовка:

template <typename T> 
Metrics<T>::Metrics() {} 
+0

Да. Я сделал Metrics :: Metrics() {} – user3421510

+0

В файле Metrics.cpp, правда, правильно? Я предполагаю, что вы не включили это в файл документа .cpp. – kec

+0

Я включил #include "Metrics.h" в файл Document.cpp. это то, что вы имели ввиду? – user3421510

0

функции шаблона должны быть определены в каждой единице перевода (.cpp) они используются в, так что вы хотите, чтобы все функции Metrics 'члены быть определены в Metrics.h, как если бы все они были встроены.

Они работают иначе, чем обычные функции, потому что генерируемый код отличается для каждого другого типа, используемого для T, поэтому компилятор не может знать, какие версии должны генерироваться при компиляции Metrics.cpp.

+0

У меня все это определено. Все еще не работает. – user3421510

+0

Так вы хотите, чтобы я также определил конструктор Metrics в файле cpp документа? – user3421510

+0

Если он определен в 'Metrics.h', а' Document.cpp' содержит '#include" Metrics.h "', то он фактически уже существует. '# include' просто копирует/вставляет во время компиляции, нет волшебства. – etheranger

 Смежные вопросы

  • Нет связанных вопросов^_^