2016-09-01 2 views
0

Я хочу, чтобы производный ClassA имел метод, который возвращает совершенно новый объект ClassA. Я получаю предупреждение компилятора о возврате ссылки на локальный объект.Шаблон Move Constructor

Некоторые люди предложили мне реализовать конструктор перемещения. Как это сделать?

код, который не работает:

#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]; 
} 

Сообщение об ошибке (Intel МОГО):

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]; 
} 

Ошибка (Intel МОГО):

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

Я посмотрел его в переполнение стека и Google. некоторые страницы упомянули конструктор перемещения, но не многие страницы говорят о конструкторе перемещения шаблона. если я знаю, почему это не работает, я бы не спросил. – 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>() {} 

компилирует с gnu и clang

Un demo here

+0

это вещь исправить. как это исправить? Некоторые люди говорят о перемещении конструктора. некоторые говорят, что возвращают указатель. Первое решение не будет работать с шаблоном. Второй кажется плохим. – rxu

+0

Это зависит от того, что вы хотите сделать. Если идея состоит в том, чтобы вернуть копию объекта, тогда сначала удалите классификатор '&' – lrleon

+0

, который не будет работать с абстрактным классом ... не может вернуть абстрактный класс. – rxu

Смежные вопросы