У меня есть шаблон класса Foo
с помощью следующей функции члена:Передача const это функции, принимающей указатель const не const-correct?
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);
}
Это не может скомпилировать, со следующей ошибкой:
error: invalid conversion from ‘
const Bar*
’ to ‘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' в порядке чтобы позволить мне передать «это»? –
@SteveLorimer Нет, ошибка возникает при создании экземпляра 'Foo', см. Мой ответ. –
vladon
@SteveLorimer Это неудобно, но да. См. Мое редактирование. –