c ++中模板化结构的错误定义错误

时间:2015-05-19 15:15:51

标签: debugging templates c++11 structure derived-class

我需要帮助理解GCC的模板派生结构的问题。

以下是名为Data.hpp的头文件的基本内容:

template <typename T> struct DataContent {

    T *ptr;  

    // more stuff would go here but has been commented out for debug
};

template <typename T> struct Data : DataContent<T> {
public: 
    uint_fast64_t N=0;

    inline Data()  {};
    inline ~Data() { delete this->ptr; };

// ****************** PROBLEM METHOD LIVES HERE *******************
    inline Data &operator= (const T &rhs) { 
        for (uint_fast32_t n=0; n<N; n++ ) this->ptr[n] = rhs; 
        return *this; 
    };
// ****************************************************************

    // more stuff would go here but has been commented out for debug    
};

template class Data<float>;
template class Data<Data<float>>;

系统是Intel i5,构建命令是:

  

g ++ - 4.9 -Wall -fexceptions -march = corei7-avx -Wnon-virtual-dtor   -Wshadow -Winit-self -Wfloat-equal -Winline -Weffc ++ -std = c ++ 11 -masm = intel -g -mfma -march = corei7-avx -mavx -O3 -std = c ++ 11 -masm = intel -g -c

我得到的错误是

Data.hpp   error: use of deleted function ‘Data<float>& Data<float>::operator=(const Data<float>&)’
Data.hpp   note: ‘Data<float>& Data<float>::operator=(const Data<float>&)’ is implicitly deleted because the default definition would be ill-formed:

以下任何一项操作本身都会导致此错误消失:

  1. 消除显式实例化template class Data<Data<float>>
  2. 使数据成为独立的结构,而不使用基本结构DataContent
  3. 在问题方法中,this->ptr[n]=rhs替换this->ptr[n]=0更改功能声明)
  4. 知道这一切,我仍然对问题的根源感到困惑。坦率地说,我只是很困惑为什么它甚至试图使用函数

    Data<float>& Data<float>::operator=(const Data<float>&)
    

    反正。我同意编译器认为它“形态错误”,但是为什么它首先尝试使用它!?我希望使用以下功能

    Data<float>& Data<float>::operator=(const float&) 
    Data<Data<float>>& Data<Data<float>>::operator=(const Data<float>&)
    

    但不是它正在尝试的那个。

    同样重要的是,令人困惑的是为什么修复#3会有所帮助。实际上,我希望修复#3在构建Data<Data<float>>类瞬时时实际上会破坏编译。

    有人可以帮忙吗? (顺便说一句,修正1-3不是最终目标的可行解决方案)

1 个答案:

答案 0 :(得分:1)

T = Data<float>(在template class Data<Data<float>>中)时,编译器不知道如何分配给Data<float>,因为它是ADT而不是内置类型,例如float (在template class Data<float>T = float)。编译器尝试自动生成默认赋值运算符,但由于const成员而失败,并将该方法标记为delete

定义DataContent& operator=(const DataContent& rhs)。 像clang这样的编译器可能会在这些情况下帮助您,因为它通常能够生成clearer error messages而不是GCC。