具有不同 const 限定符的 2 种类型之间的转换

conversion between 2 types with different const qualifiers

这是我要使用的代码的一个简短示例:

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实际上是一个容器class我写的(比如说一个列表)

  2. A 是 class 使用该列表

  3. func1 是一个需要查找元素是否在列表中的函数

  4. func2 是一个函数,它接收要从列表中删除的元素

如果你想要对 const 指针的引用,那么试试这个:

B<const int*> b;

如果您肯定知道您传入的内容最初不是 const int *(也就是说,您最初有一个 int * 并且它一路上变成了const int *),那么你可以这样做:

b.func1(const_cast<int *>(a));

请注意,如果不满足我提到的先决条件,这可以 easily lead to undefined behavior。这很令人困惑,因为函数的用户不希望函数改变指针指向的内容。最好从一开始就传入 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 是指向某物的指针;你将不得不 fiddle 更多地使用它来处理非指针。

int*用于实例化B时,函数

void func1(const T& t) {}

相当于:

void func1(int* const& t) {}

const int* 类型的参数与 int* const& 不兼容。

你需要重新考虑一下你的函数。

更新

A 中使用 B<int> 而不是 B<int*> 可能正是您要寻找的。

class A
{
      B<int> b;
   public:
      void func2(const int* a)
      {
         b.func1(*a);
      }
};