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

时间:2015-10-13 19:31:51

标签: c++ pointers const const-cast template-classes

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

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&amp;'

是一种在不更改函数声明和不使用const_cast的情况下解决此问题的方法吗?

修改

问题背后的一些信息

  1. B实际上是我写的容器类(比如说清单)

  2. A是使用该列表的类

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

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

2 个答案:

答案 0 :(得分:6)

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);
      }
};

答案 1 :(得分:3)

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

B<const int*> b;

如果您确实知道 ,那么您传入的内容最初不是const int *(也就是说,您最初拥有int *并且它变成了{{ 1}}在某个地方),然后你可以这样做:

const int *

请注意,如果不满足我提到的前提条件,则可以easily lead to undefined behavior。它令人困惑,因为函数的用户不希望函数改变指针所指向的内容。最好从一开始就传递b.func1(const_cast<int *>(a));

int *

根据您的latest comment,我认为这就是您想要的:

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 *是指向某事物的指针;你必须更多地使用它来为非指针工作。