2

我现在有

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 *”转换为“int *const &”

是否有可能以某种方式解决它?

只有我现在能想到的是将这个 claxx 部分专门化为指针,但我不确定。

template<class C> class Array<C*>
{
inline int Search(const C *&value) const;
...
}

这是好方法吗,也许可以在不创建部分专业化的情况下做到这一点?

4

1 回答 1

1

正如您所注意到的,您的问题来自这样一个事实,即您正在向模板参数添加顶级const,但是当涉及到指针时,它会产生T * constnot 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;
  ...
};
于 2013-07-05T09:18:36.600 回答