我有一个类模板 Foo
,其中包含以下成员函数:
bool contains(const T& item) const
我已经使用指针类型实例化了它:Foo<Bar*>
,因此我期望成员函数现在将具有以下签名:
bool contains(const Bar*& item) const
在一个
const
的 Bar
成员函数中,我试图将 this
传递给 Foo<Bar*>::contains
:bool Bar::func(const Foo<Bar*>& foo) const
{
return foo.contains(this);
}
以下代码无法编译,会出现以下错误:
错误:从“const Bar*”转换到“Bar*”时无效
问题:
- 为什么我的
const T&
参数不符合常量正确性? Foo<T>::contains(...) const
的哪个签名需要允许使用this
进行编译调用?
完整示例:
#include <vector>
#include <algorithm>
template<typename T>
struct Foo
{
bool contains(const T& item) const
{
return false;
}
};
struct Bar
{
bool func(const Foo<Bar*>& foo) const
{
return foo.contains(this);
}
};
错误输出:
scratch/main.cpp:17:33: error: invalid conversion from ‘const Bar*’ to ‘Bar*’ [-fpermissive]
return foo.contains(this);
^
scratch/main.cpp:7:10: note: initializing argument 1 of ‘bool Foo<T>::contains(const T&) const [with T = Bar*]’
bool contains(const T& item) const
Foo
成员函数进行任何更改,以便允许我将this
传递给它吗? - Steve LorimerFoo<Bar*>
时会出现错误,请参考我的回答。 - vladonFoo
类可以适用于指针类型和非指针类型。因此,在签名中它应该只需要一个const ref to T
- 我需要有两个重载并在指针类型上使用enable_if
的 SFINAE 来使其工作吗? - Steve Lorimerconst_bare_type
,它将为非指针类型产生const T
,并为指针类型产生const T *
。然后声明contains(const_bare_type&item)
。 - Yam Marcovic