函数模板和私有拷贝构造函数

时间:2014-01-22 09:50:14

标签: c++ class templates

我正在尝试实现以下比较功能模板:

template<typename T>
int     compare(T x, T y)
{
  if (x > y)
   return 1;
  else if (x < y)
   return -1;
  else
   return 0;
}

它适用于所有经典类型,但以下类不起作用:

class c
{
private:
  c &operator=(const c&) {return *this;}
  c(const c &){}
public:
  bool operator==(const c&) const {return true;}
  bool operator>(const c&) const {return false;}
  bool operator<(const c&) const {return false;}
  c(){}
};

当我尝试比较我的类的两个实例时,编译器大喊他不能,因为复制ctor是私有的,我试图将引用传递给我的函数模板,但它不起作用。有什么想法吗?

3 个答案:

答案 0 :(得分:6)

您可以使模板参考:

template<typename T>
int     compare(const T& x, const T& y)

这样,不涉及任何副本。

答案 1 :(得分:0)

您传递的值需要创建参数的副本。这就是为什么它需要创建副本,因此它需要复制构造函数。通过引用或指针传递将有助于此。

template<typename T>
int     compare(const T& x, const T& y)

template<typename T>
int     compare(const T* x, const T* y)

答案 2 :(得分:0)

您的模板用于按值传递的对象,而类中的复制Ctor需要对象引用;编译器将尝试使用默认的Ctor,因为它没有找到它,它会尖叫以寻求帮助。

解决方案:

either define the template so that it accepts object references (as already suggested)
or
define the copy constructor