Преобразование между 2 типами с различными квалификаторами const
Это короткий пример кода, который я хочу использовать:
template <class T>
class B
{
public :
bool func1(const T& t)
{
// do something
}
};
class A
{
B<int*> b;
public:
void func2(const int* a)
{
b.func1(a);
}
};
Я получаю эту ошибку:
ошибка C2664: "B::func1": невозможно преобразовать параметр 1 из "const int *" в "int *const &"
способ решить эту проблему без изменения объявлений функций и без использования const_cast?
Редактировать:
некоторая информация, стоящая за проблемой
B
на самом деле класс контейнера, который я написал (скажем, список)A
это класс, использующий этот списокfunc1
это функция, которая должна найти, если элемент находится в списке или нетfunc2
это функция, которая получает элемент для удаления из списка
2 ответа
Если вы хотите ссылку на указатель const, попробуйте это:
B<const int*> b;
Если вы точно знаете , что то, что вы проходите, изначально не const int *
(то есть у вас изначально есть int *
и это превратилось в const int *
где-то по пути), то вы можете сделать это:
b.func1(const_cast<int *>(a));
Обратите внимание, что это может легко привести к неопределенному поведению, если упомянутое условие не выполнено. И это сбивает с толку, потому что пользователь функции не ожидал бы, что функция изменит то, на что указывает указатель. Лучше пройти в int *
с самого начала идти:
void func2(int* a)
{
b.func1(a);
}
Основываясь на вашем последнем комментарии, я думаю, что это то, что вы хотите:
template <class T>
class B
{
typedef typename std::remove_pointer<T>::type base_type;
typedef typename std::add_const<base_type>::type const_base_type;
typedef typename std::add_pointer<const_base_type>::type pointer_const_base_type;
public :
void func1(const pointer_const_base_type& t)
{
std::cout << t << std::endl;
}
};
Дано T = base_type *
Я кропотливо наращиваю pointer_const_base_type = const base_type *
, Сейчас func1
берет ссылку на это const base_type *
, Обратите внимание, это предполагает, что T
указатель на что-то; вам придется больше возиться с ним, чтобы работать не для указателей.
Когда int*
используется для создания экземпляра B
, функция
void func1(const T& t) {}
эквивалентно:
void func1(int* const& t) {}
Параметр типа const int*
не совместим с int* const&
,
Вам нужно немного переосмыслить свои функции.
Обновить
Использование B<int>
вместо B<int*>
в A
может быть то, что вы ищете.
class A
{
B<int> b;
public:
void func2(const int* a)
{
b.func1(*a);
}
};