具有不同 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?
即可解决此问题的方法
编辑:
问题背后的一些信息
B
实际上是一个容器class我写的(比如说一个列表)
A
是 class 使用该列表
func1
是一个需要查找元素是否在列表中的函数
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);
}
};
这是我要使用的代码的一个简短示例:
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?
即可解决此问题的方法编辑:
问题背后的一些信息
B
实际上是一个容器class我写的(比如说一个列表)A
是 class 使用该列表func1
是一个需要查找元素是否在列表中的函数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);
}
};