这是我想要使用的代码的简短示例:
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的情况下解决此问题的方法吗?
修改
问题背后的一些信息
B
实际上是我写的容器类(比如说清单)
A
是使用该列表的类
func1
是一个需要查找元素是否在列表中的函数
func2
是一个接收要从列表中删除的元素的函数
答案 0 :(得分:6)
当int*
用于实例化B
时,函数
void func1(const T& t) {}
相当于:
void func1(int* const& t) {}
const int*
类型的参数与int* const&
不兼容。
您需要重新考虑一下您的功能。
<强>更新强>
在B<int>
中使用B<int*>
代替A
可能就是您要找的。 p>
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 *
是指向某事物的指针;你必须更多地使用它来为非指针工作。