为什么const成员导致错误
Why const member caused error?
#include <vector>
class B {
};
class A {
const std::vector<B> m_v;
public:
A(const std::vector<B>& v) : m_v(v) {}
void doSomething() {}
};
void foo(void* bar) {
A* a = (A*)bar;
a->doSomething();
}
int main() {
std::vector<B> v;
std::vector<A > l;
for (auto i = 0; i < 10; i++) {
A a(v);
l.push_back(std::move(a));
foo((void*)&l[i]);
}
return 0;
}
$g++-Wall initList.cpp-o initList-lrt-O3-std=c++0x在/usr/lib/gcc/x86_64-redhat-linux/4.6.2/../../include/c++/4.6.2/vector:70:0中包含的文件中,来自initList.cpp:1:/usr/lib/gcc/x86_64-redhat-linux/4.6.2/../../../include/c++/4.6.2/bits/vector.tcc:在成员函数\u2018void std::vector::_M_insert_aux(std::vector::迭代器,_Args&&…)[其中_Args={A},_Tp=A,_Alloc=std::分配器,std::向量::迭代程序=__gnu_cxx::__normal_iterator>,typename std::_vector_base::_Tp_Alloc_type::pointer=A*]`:/usr/lib/gcc/x86_64-redhat-linux/4.6.2/../../../include/c++/4.6.2/bits/vector.tcc:102:4:从\u2018void std::vector::template_back(_Args&&…)实例化[其中_Args={A},_Tp=A,_Alloc=std::分配器]`/usr/lib/gcc/x86_64-redhat-linux/4.6.2/../../../include/c++/4.6.2/bits/sstl_vector.h:840:9:从\u2018void std::vector::push_back(std::vector::value_type&&)实例化[其中_Tp=A,_Alloc=std::分配器,std::向量::value_type=A]`initList.cpp:23.27:从这里实例化//usr/lib/gcc/x86_64-redhat-linux/4.6.2/../../../include/c++/4.6.2/bits/vector.tcc:319:4:error:使用删除的函数'&A::operator=(const A&)`initList.cpp:6:7:错误:"&A::operator=(const A&)"被隐式删除,因为默认定义格式不正确:initList.cpp:6:7:错误:将\u2018const std::vector`as\u2018this`\u2018std::vector&std::vector::operator=(const std::vector&)[with_Tp=B,_Alloc=std::allocator]`的参数传递为\u2018this'将丢弃限定符[-fpermission]在/usr/lib/gcc/x86_64-redhat-linux/4.6.2/../../include/c++/4.6.2/vector:61:0中包含的文件中,来自initList.cpp:1:/usr/lib/gcc/x86_64-redhat-linux/4.6.2/../../../include/c++/4.6.2/bits/sstl_algobase.h:在静态成员函数\u2018static_BI2 std::__copy_move_backward::__copy _move_b(_BI1,_BI1和_BI2)[其中_BI1=A*,_BI2=A*]`:/usr/lib/gcc/x86_64-redhat-linux/4.6.2/../../../include/c++/4.6.2/bits/str_algobase.h:581:18:从\u2018_BI2 std::__copy_move_backward_a(_BI1,_BI1和_BI2)实例化[其中布尔_IsMove=true,_BI1=a*,_BI2=a*]`/usr/lib/gcc/x86_64-redhat-linux/4.6.2/../../../include/c++/4.6.2/bits/str_algobase.h:590:34:从\u2018_BI2 std::__copy_move_backward_a2(_BI1,_BI1和_BI2)实例化[其中布尔_IsMove=true,_BI1=A*,_BI2=A*]`/usr/lib/gcc/x86_64-redhat-linux/4.6.2/../../../include/c++/4.6.2/bits/str_algobase.h:661:15:从\u2018_BI2 std::move_backward(_BI1,_BI1和_BI2)实例化[其中_BI1=A*,_BI2=A*]`/usr/lib/gcc/x86_64-redhat-linux/4.6.2/../../../include/c++/4.6.2/bits/vector.tcc:313:4:从\u2018void std::vector::_M_insert_aux(std::vector::迭代器,_Args&&…)实例化[其中_Args={A},_Tp=A,_Alloc=std::分配器,std::向量::迭代程序=__gnu_cxx::__normal_iterator>,类型名std::_vector_base::_Tp_Alloc_type::pointer=A*]`/usr/lib/gcc/x86_64-redhat-linux/4.6.2/../../../include/c++/4.6.2/bits/vector.tcc:102:4:从\u2018void std::vector::template_back(_Args&&…)实例化[其中_Args={A},_Tp=A,_Alloc=std::分配器]`/usr/lib/gcc/x86_64-redhat-linux/4.6.2/../../../include/c++/4.6.2/bits/sstl_vector.h:840:9:从\u2018void std::vector::push_back(std::vector::value_type&&)实例化[其中_Tp=A,_Alloc=std::分配器,std::向量::value_type=A]`initList.cpp:23.27:从这里实例化//usr/lib/gcc/x86_64-redhat-linux/4.6.2/../../../include/c++/4.6.2/bits/sstl_algobase.h:546:6:error:使用已删除的函数'&A::operator=(const A&)`
如果我不为m_v指定const。它编译得很好。
这个错误表明assign运算符有问题,我不知道它是如何调用的。
知道吗?
提前谢谢。
这是旧版本的GCC/libstdc++中的一个错误,您的代码可以用GCC 4.8.1编译得很好现场示例。错误由触发
l.push_back(std::move(a));
因为较旧版本的GCC试图在向量中创建默认构造的元素,并在第二步中将参数CCD_。
相关文章:
- 静态数据成员的问题-修复链接错误会导致编译器错误
- C++错误消息*成员参考.**初学者*
- C++错误C2600:无法定义编译器生成的特殊成员函数(必须首先在类中声明)
- 为什么类中的ostringstream类型的成员会导致";调用隐含删除复制构造函数";错误
- 在运算符重载定义中使用成员函数(const错误)
- 错误:请求非类类型为"MULTIMEDIA_FILME [500]"的成员|
- 使用带有 ref 参数的成员函数创建线程时出现编译错误
- 静态成员函数使用相同的名称时出现模板类型名称错误
- 为什么即使我声明了朋友类,我也会收到错误"无法访问类中声明的私人成员"
- 为什么我在空指针错误(链表)中获取成员访问权限
- WinLamb 错误:成员初始化非法
- 类成员值的合法或错误成员用法
- for 循环说 - 错误 成员引用基类型"int [13]"不是结构或联合
- C++错误:成员声明末尾的预期“;”
- C++:错误:成员访问不完整的类型,未使用的参数[-Werror,-Wunused-parameter]
- 错误:成员函数不能在其类之外声明
- 初始化 cpp 文件中的私有静态成员变量.错误:成员是私有的
- 错误:成员访问不完整类型:前向声明
- 错误:成员不可访问
- 指向基类错误成员函数的指针