2016-09-01 16 views
0

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) 
+0

でコンパイルし、初期化するいくつかのコンストラクタを置く

。いくつかのページはコンストラクタを移動すると言われていますが、テンプレート移動コンストラクタに関する多くのページでは説明していません。私はそれが動作しない理由を知っていれば、私は尋ねることはありません。 – rxu

+2

質問に使用しているコンパイラを追加してください –

+0

intel icc。よく私はちょうど "http://stackoverflow.com/questions/11028929/move-operator-with-templates?rq=1"を見つけたので、彼らが実際に提案した "解決策"は機能しません。 – rxu

答えて

1

は、少なくとも次の部分でエラーが発生している:

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>() {} 
などのいくつかの

私はスタックオーバーフローとGoogleでそれを見上げgnuclang

Un demo here

+0

これは修正するべきものです。どのようにそれを修正するには?一部の人々はコンストラクタを移動すると言います。ポインタを返すと言う人もいます。 1番目のソリューションはテンプレートでは機能しません。第2のものは悪いようです。 – rxu

+0

それはあなたが何をしたいかによって決まります。オブジェクトのコピーを返すことで、最初に '&'修飾子を削除するのであれば、 – lrleon

+0

抽象クラスを削除しても動作しません...抽象クラスを返すことはできません。 – rxu

関連する問題