2016-01-09 2 views
2

Итак, у меня есть такие классы: Matrix и Matrix_Proxy. Оба должны проверить, действительно ли диапазон действителен, но здесь я пропустил это, потому что это не проблема.Прокси-сервер класса матрицы для оператора [] error

До тех пор, пока объекты не являются константами, это нормально, но это не будет сделано. Отправка функциональных параметров на const& является эффективной практикой, и поэтому здесь она терпит неудачу.

Код (упрощенно):

#include <vector> 
#include <cstdlib> 
#include <iostream> 

template <typename T> 
class Matrix_Proxy 
{ 
public: 
    Matrix_Proxy(std::vector<T>& _ref, size_t _size) : ref(_ref), size(_size) 
    {} 
    T& operator[](int i) 
    { 
     return ref[i]; 
    } 

    const T& operator[](int i) const 
    { 
     return ref[i]; 
    } 

private: 
    std::vector<T>& ref; 
    size_t size; 

}; 

template <typename T> 
class Matrix 
{ 
public: 
    Matrix(size_t x) : values(x), size(x) 
    { 
     for(auto&& y : values) 
     { 
      y.resize(x); 
      for(auto&& x : y) 
       x = 0; 
     } 
    } 

    Matrix_Proxy<T> operator [] (int i) 
    { 
     return Matrix_Proxy<T>(values[i],size); 
    } 

    const Matrix_Proxy<T> operator [] (int i) const 
    { 
     return Matrix_Proxy<T>(values[i],size); 
    } 

private: 
    std::vector<std::vector<T>> values; 
    size_t size; 
}; 

int main() 
{ 
    Matrix<int> intMat(5);     //FINE 
    std::cout << intMat[2][2] << std::endl; //FINE 

    const Matrix<int> cintMat(5);    //FINE 
    std::cout << cintMat[2][2] << std::endl; //ERROR 

    _Exit(EXIT_SUCCESS); 
} 

Ошибка:

no matching function for call to 'Matrix_Proxy<int>::Matrix_Proxy(const value_type&, const size_t&)' 
     return Matrix_Proxy<T>(values[i],size); 
              ^

Любые идеи, как решить эту проблему?

ответ

2

Основная причина проблемы заключается в том, что ваш прокси-сервер допускает неконстантный доступ, даже если сам прокси-сервер был создан с помощью оператора const. Другими словами, ваш код, если он может составить, позволит это:

const Matrix<int> cintMat(5); 
cintMat[2][2] = 2; // Does not compile 

Это происходит потому, что Matrix_Proxy производится из operator [] const имеет как operator [] const и operator [] неконстантную. Ваш Matrix_Proxy не имеет понятия, что он был произведен через оператора const!

Чтобы устранить эту проблему, ввести еще один прокси-сервер, и вернуть его из const оператора []:

template <typename T> 
class Matrix_Proxy_Const 
{ 
public: 
    Matrix_Proxy_Const(const std::vector<T>& _ref, size_t _size) : ref(_ref), size(_size) 
    {} 
    const T& operator[](int i) const { 
     return ref[i]; 
    } 
private: 
    const std::vector<T>& ref; 
    size_t size; 
}; 

В Matrix классе изменить реализацию const оператора:

const Matrix_Proxy_Const<T> operator [] (int i) const { 
    return Matrix_Proxy_Const<T>(values[i],size); 
} 

Demo.

+0

Ничего себе, теперь все отлично :) Но я все еще владел std :: vector , но это не поможет. Благодаря :) – xinaiz

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

  • Нет связанных вопросов^_^