模板移动构造函数
Template Move Constructor
我希望派生的ClassA有一个返回ClassA的全新对象的方法。我得到编译器关于返回对局部对象的引用的警告。
有些人建议我需要实现一个移动构造函数。怎么做呢?
不工作的代码:
#include <iostream>
using namespace std;
template <typename T>
class AbstractClass {
public:
virtual AbstractClass<T>& operator[](int index) = 0;
} ;
template <typename T>
class ClassA : public AbstractClass<T> {
public:
ClassA<T>& operator[](int index){
ClassA<T> A;
return A;
}
ClassA(ClassA && c){
//move constructor that doesn't work.
}
} ;
template <typename T>
class ClassB : public ClassA<T> {
public:
ClassA<T>& operator[](int index){
ClassA<T> A;
return A;
}
} ;
int main(void){
ClassA<int> A;
A[0][1][2];
}
Error message (intel icc):
test2.cpp(15): error: copy constructor for class "ClassA<T>" may not have a parameter of type "ClassA<T>"
ClassA(ClassA && c){
^
另一个版本:
#include <iostream>
using namespace std;
template <typename T>
class AbstractClass {
public:
virtual AbstractClass<T> operator[](int index) = 0;
} ;
template <typename T>
class ClassA : public AbstractClass<T> {
public:
ClassA<T>() {}
ClassA<T> operator[](int index){
ClassA<T> A;
return A;
}
} ;
template <typename T>
class ClassB : public ClassA<T> {
public:
ClassA<T> operator[](int index){
ClassA<T> A;
return A;
}
} ;
int main(void){
ClassA<int> A;
A[0][1][2];
}
Error (intel icc):
test2.cpp(12): error: return type is neither identical to nor covariant with return type "AbstractClass<int>" of overridden virtual function "AbstractClass<T>::operator[] [with T=int]"
ClassA<T> operator[](int index){
^
detected during instantiation of class "ClassA<T> [with T=int]" at line 26
test2.cpp(26): error: object of abstract class type "ClassA<int>" is not allowed:
pure virtual function "AbstractClass<T>::operator[] [with T=int]" has no overrider
ClassA<int> A;
^
test2.cpp(12): error: function returning abstract class "ClassA<int>" is not allowed:
pure virtual function "AbstractClass<T>::operator[] [with T=int]" has no overrider
ClassA<T> operator[](int index){
^
detected during instantiation of "ClassA<T> ClassA<T>::operator[](int) [with T=int]" at line 27
test2.cpp(13): error: object of abstract class type "ClassA<int>" is not allowed:
pure virtual function "AbstractClass<T>::operator[] [with T=int]" has no overrider
ClassA<T> A;
^
detected during instantiation of "ClassA<T> ClassA<T>::operator[](int) [with T=int]" at line 27
compilation aborted for test2.cpp (code 2)
至少在以下部分有错误:
ClassA<T>& operator[](int index){
ClassA<T> A; // <-- this variable will be destroyed
return A; // and you return a reference to A
}
返回值是对时间变量A
的引用,该变量将在操作符[]
执行后销毁。
我建议你先修复这个错误。
此外,您没有任何初始化类的构造函数。
放置一些初始化的构造函数,例如
ClassA<T>() {}
与gnu
和clang
编译
相关文章:
- 为什么不调用移动构造函数?(默认情况下只有构造器,没有别的)
- std::vector::p ush_back() 不会在 MSVC 上编译具有已删除移动构造函数的对象
- 仅包含可移动 std::map 的类的移动构造函数不起作用
- 为什么调用复制构造函数而不是移动构造函数?
- 基类中的默认析构函数禁用子类中的移动构造函数(如果有成员)
- 从具有按值捕获的 lambda 移动构造 std::函数时,移动构造函数调用两次
- 具有已删除移动和复制构造函数的类的就地构造
- 移动构造函数和右值引用
- 使用移动调用对等构造函数unique_ptr默认构造函数
- 为什么 std::memmove 中联合的默认非平凡移动构造函数C++?
- 具有专用化的模板类中的可靠条件复制和移动构造函数
- 构造函数采用std::string_view与std::string并移动
- C++:为什么不调用移动构造函数?
- 了解构造函数在移动、复制、赋值语义中的行为
- 没有移动的构造函数移动课程
- 引用绑定和复制构造函数/移动构造函数
- 构造函数移动
- C++ 向量实现 - 移动构造函数 - 移动与前进
- 我真的必须取消移动构造函数/移动结构中的所有成员还是只是指针
- 将类(没有默认构造函数)移动到另一个类的move构造函数中