2016-05-05 148 views
0

編輯:這不是沒有在頭中定義模板的問題。此錯誤是由於未定義複製構造函數而造成的。奇怪的未定義參考錯誤

我試着用谷歌搜索這個,但我找不到任何東西,除了人們調用沒有合適的參數和沿着這些線條的東西的事情的問題。所以,這裏有一個來自main的非常小的塊。我創建了一個模板化的容器類,並將其初始化爲一個包含字符串的測試。 sorted.h包含在兩個.cpp文件中。

錯誤的位置:http://imgur.com/OvdCHFO

// Test assignment operator 
    // Can test copy constructor by changing following two lines to 
    // sorted<string> test(songs); 
    sorted<string> test; 
    test = songs; // Error occurs when commenting this line back in. 

這裏是我的重載的賦值運算符。我認爲這是什麼導致這個問題,因爲評論將使用它的行是什麼導致鏈接器錯誤。任何人都有一個想法,我在這裏做錯了什麼?

//Overloaded assignment operator. (sorted.cpp) 
template <class T> 
sorted<T> sorted<T>::operator=(const sorted<T>& srtd){ 

    if (this != &srtd){ 
    delete [] m_data; 
    delete [] m_randfinal; 

    m_data = new T[srtd.m_capacity]; 
    m_randfinal = new T[srtd.m_size]; 
    m_size = srtd.m_size; 
    m_capacity = srtd.m_capacity; 

    for (int i = 0; i < m_size; i++){ 
     m_data[i] = srtd.m_data[i]; 
     m_randfinal[i] = srtd.m_randfinal[i]; 
    } 
    } 

    return *this; 
} 

sorted.h中的聲明。

// Overloaded assignment operator 
sorted<T> operator=(const sorted<T>& srtd); 
+1

模板類的實現必須位於標題中,以便編譯器正確地實例化它們。 –

+0

是的,我們被教會在頭部的底部包含cpp文件以避免這種情況。教授說這在技術上並不是一個好的做法,但它暫時解決了這個問題。不過,我的計劃中的其他一切都在努力。 – swingonaspiral

+0

我試着將它移動到頭文件,但沒有骰子。 – swingonaspiral

回答

0

鏈接器錯誤消息表明代碼需要調用複製構造函數,但無法找到它。如果你自己定義了任何構造函數,請記住隱式拷貝構造函數將被禁用,你需要自己定義一個。

另外,請記住,模板類的實現必須位於標頭中,以便編譯器正確地實例化它們。