我需要帮助理解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:
以下任何一项操作本身都会导致此错误消失:
template class Data<Data<float>>
this->ptr[n]=rhs
替换this->ptr[n]=0
(不更改功能声明)知道这一切,我仍然对问题的根源感到困惑。坦率地说,我只是很困惑为什么它甚至试图使用函数
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不是最终目标的可行解决方案)
答案 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。