Теперь у меня есть
template<class C> class Array
{
inline int Search(const C &value) const;
...
}
я хочу использовать таким образом
Array<int *> a;
int i;
const int *pi = &i;
a.Search(pi);
но я получил
ошибка C2664: «A :: Search»: невозможно преобразовать параметр 1 из «const»
int * ‘to’ int * const &’
возможно ли это как-то обойти?
Только я могу думать пока, что это частично специализировать этот клакс для указателей, но я не уверен.
template<class C> class Array<C*>
{
inline int Search(const C *&value) const;
...
}
Это хороший способ, может быть, это можно сделать без частичной специализации?
Как вы заметили, ваша проблема связана с тем, что вы добавляете верхний уровень const
к вашему параметру шаблона, но когда дело доходит до указателей, это дает T * const
не T const *
,
Специализация вашего шаблона — это один из способов добиться того, чего вы хотите.
Другой способ — создать вспомогательный шаблон, который позаботится о глубокой «консистенции», и использовать его в своем основном шаблоне. Обычно это проще сделать, потому что это означает меньшее дублирование кода. Что-то вроде:
template<typename C>
struct Constify {
typedef const C type;
};
template<typename C>
struct Constify<C*> {
typedef const C* const type;
};
template<class C>
class Array
{
inline int Search(typename Constify<C>::type & value) const;
...
};
Других решений пока нет …