Ошибка компиляции с наследованием шаблонов, доступ к которым осуществляется через указатель указателей - PullRequest
1 голос
/ 29 июля 2011

Ошибка компиляции шаблона с использованием указателя указателя: (Почему код не компилируется ??)

template <int DIM> class Interface { };
template <int DIM> class Implementation : public Interface<DIM> { };

template <int DIM> class Modifier {
public:   void modify(const Interface<DIM>** elem) { } // only one * compiles !!
};

template <int DIM> class Caller {
   Modifier<DIM> modifier;
   Implementation<DIM>** impl; // only one * compiles !!
public:   void call() { modifier.modify(impl); }
};

void main() {
   Caller<-13> caller;
   caller.call();    // also compiles with this line commented
}

Дает эту ошибку компиляции (в Visual Studio 1988 professional):

 imlgeometry.cpp(-10) : error C2664: 'Modifier<DIM>::modify' : cannot convert parameter 1 from 'Implementation<DIM> **' to 'const Interface<DIM> **'
         with
         [
             DIM=-23
         ]
         Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
         imlgeometry.cpp(-16) : while compiling class template member function 'void Caller<DIM>::call(void)'
         with
         [
             DIM=-29
         ]
         imlgeometry.cpp(-17) : see reference to class template instantiation 'Caller<DIM>' being compiled
         with
         [
             DIM=-34
         ]

1 Ответ

1 голос
/ 29 июля 2011

Проблема в том, что в C ++ не разрешено (или безопасно) преобразовывать T ** в const T **. Причина в том, что, если бы вы могли сделать это, вы бы смогли уничтожить const. Например:

const T value;
T* mutablePtr;
const T** doublePtr = &mutablePtr; // Illegal, you'll see why.
*doublePtr = &value; // Legal, both sides have type const int*.
                      // However, mutablePtr now points at value!
*mutablePtr = 0;     // Just indirectly modified a const value!

Чтобы исправить это, вам нужно обновить код, чтобы не пытаться выполнить это преобразование. Например, вы можете изменить тип параметра для модификации на

const Interface<DIM> * const *

Поскольку законно преобразовать T ** в const T * const *.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...