2016-05-05 149 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

链接器错误消息表明代码需要调用复制构造函数,但无法找到它。如果你自己定义了任何构造函数,请记住隐式拷贝构造函数将被禁用,你需要自己定义一个。

另外,请记住,模板类的实现必须位于标头中,以便编译器正确地实例化它们。