我正在尝试实现以下比较功能模板:
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是私有的,我试图将引用传递给我的函数模板,但它不起作用。有什么想法吗?
答案 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