В C ++ для некоторого типа T, как я могу получить "const T **" из "T **"? - PullRequest
0 голосов
/ 06 октября 2011

У меня есть следующий фрагмент кода C ++:

class T { };

void f(const T**) { }

int main() {
    T *x = new T[5];
    f(&x);
}

Когда я пытаюсь скомпилировать, g ++ сообщает invalid conversion from 'T**' to 'const T**'.Я провел некоторое исследование , и я понимаю эту ошибку.Типичное исправление состоит в том, чтобы изменить определение f(const T**) на f(const T* const*), что немедленно решает проблему.

К сожалению, в моем случае, f - это функция в другой библиотеке, и я не могу изменитьопределение е .Как я могу передать адрес x на f?

Ответы [ 3 ]

4 голосов
/ 06 октября 2011

Вместо этого вы можете передать адрес указателя с тем же значением, что и x.

int main() {
    T *x = new T[5];
    T const *y = x;
    f(&y);
}

Когда возвращается f, вы можете скопировать значение обратно в x.

Вы также можете разыграть адрес. Запись через T const * в объект типа T * не является нарушением псевдонимов.

int main() {
    T *x = new T[5];
    f(const_cast<T const**>(&x));
}

Тот факт, что это действительно так, менее очевиден, чем, по-моему, просто передача копии и последующее присвоение обратно x.

2 голосов
/ 06 октября 2011
T const* x = new T[5];
f(&x);

или

T *x = new T[5];
f(&const_cast< T const*& >( x ) );
0 голосов
/ 06 октября 2011
class T { };

void f(const T**) { }

int main() {
  T *x = new T[5];
  const T* y = x; // <====
  f(&y); // use y
}

http://ideone.com/oWZQR

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