Преобразование между 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?

Редактировать:

некоторая информация, стоящая за проблемой

  1. B на самом деле класс контейнера, который я написал (скажем, список)

  2. A это класс, использующий этот список

  3. func1 это функция, которая должна найти, если элемент находится в списке или нет

  4. 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);
      }
};
Другие вопросы по тегам