3

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

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是一个接收要从列表中删除的元素的函数

4

2 回答 2

6

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

void func1(const T& t) {}

相当于:

void func1(int* const& t) {}

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

您需要重新考虑一下您的功能。

更新

使用 ofB<int>而不是B<int*>inA可能是您正在寻找的。

class A
{
      B<int> b;
   public:
      void func2(const int* a)
      {
         b.func1(*a);
      }
};
于 2015-10-13T19:39:43.660 回答
3

如果您想要对 const 指针的引用,请尝试以下操作:

B<const int*> b;

如果您确定您传入的内容最初不是 a 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是指向某物的指针;您将不得不更多地摆弄它才​​能为非指针工作。

于 2015-10-13T19:33:59.750 回答