模板类的编译错误

Posted

技术标签:

【中文标题】模板类的编译错误【英文标题】:Compilation error with template class 【发布时间】:2016-05-05 06:33:46 【问题描述】:

我尝试使用以下代码 sn-p 并得到如下所述的编译错误

代码sn-p:

#include <iostream>

using namespace std;

template <class TYPE1>
struct SDataContainer

    SDataContainer(TYPE1 pData)
    
        m_pData = pData;
    

    bool operator==(const SDataContainer<TYPE1>& pData)
    
        return (m_pData == pData.m_pData);
    

    TYPE1 m_pData;
;
template <class DATATYPE1>
class Comparison

    public:
        Comparison (const SDataContainer<DATATYPE1>& pSData)
        
            m_SData = pSData;
        
        bool operator==(const Comparison<DATATYPE1>& pData)
        
            return (m_SData.m_pData == pData.m_SData.m_pData);
        
        SDataContainer<DATATYPE1> m_SData;
;
int main()

    SDataContainer<float> sDCObj1 (10.0);
    SDataContainer<float> sDCObj2 (10.0);
    cout << "Verify the data: " << (sDCObj1 == sDCObj2) << endl;
    Comparison<float> sCObj1 (sDCObj1);
    Comparison<float> sCObj2 (sDCObj2);
    cout << "Verify the data: " << (sCObj1 == sCObj2) << endl;
    return 0;

编译错误:

template.cpp:在构造函数中 âComparison::Comparison(const SDataContainer&) [with DATATYPE1 = float]â: template.cpp:45:38: 从这里实例化 template.cpp:26:9: error: no matching function for call to âSDataContainer::SDataContainer()â template.cpp:26:9: 注意:候选人是: template.cpp:8:5: 注意:SDataContainer::SDataContainer(TYPE1) [with TYPE1 = float] template.cpp:8:5: 注意:候选人需要 1 个参数,提供 0 template.cpp:6:8: 注意:SDataContainer::SDataContainer(const SDataContainer&) template.cpp:6:8: 注意:候选人需要 1 个参数,0 提供

我无法得到编译错误的原因。

有人可以帮我解决这个问题吗?

【问题讨论】:

只有一个构造函数供SDataContainer&lt;DATATYPE1&gt; m_SData 成员触发,SDataContainer(TYPE1 pData),它不是默认值。错误消息似乎与问题所在有关。 【参考方案1】:

问题是

    Comparison (const SDataContainer<DATATYPE1>& pSData)
      // <<< here
    
        m_SData = pSData;
    

因为你没有提供一个初始化列表,所以对你来说是一个暗示,就像你写的那样:

    Comparison (const SDataContainer<DATATYPE1>& pSData)
    : m_SData()
    
        m_SData = pSData;
    

想要调用 SDataContainer 的默认构造函数。

解决方案是像这样更改您的代码:

    Comparison (const SDataContainer<DATATYPE1>& pSData)
    : m_SData(pSData)
    
    

或向 SDataContainer 添加默认构造函数。

工作演示:http://ideone.com/Z0ycCj

【讨论】:

以上是关于模板类的编译错误的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio 2008 在编译模板时不关心基类的存在?

gcc 编译器标志在编译期间抑制模板扩展的模板错误?

为啥这个私有模板函数会编译? -> 编译器错误 VS 2009

Sun Studio 12 中的模板编译错误

使用 ARM GCC 编译列表迭代器时的模板编译时错误

模板模板参数和模板别名:编译器错误?