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];
}
エラーメッセージ(インテル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];
}
エラー(インテル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)
でコンパイルし、初期化するいくつかのコンストラクタを置く
。いくつかのページはコンストラクタを移動すると言われていますが、テンプレート移動コンストラクタに関する多くのページでは説明していません。私はそれが動作しない理由を知っていれば、私は尋ねることはありません。 – rxu
質問に使用しているコンパイラを追加してください –
intel icc。よく私はちょうど "http://stackoverflow.com/questions/11028929/move-operator-with-templates?rq=1"を見つけたので、彼らが実際に提案した "解決策"は機能しません。 – rxu