2014-01-22 2 views
-1

나는 다음과 같은 비교 함수 템플릿을 구현하기 위해 노력하고있어 :기능 템플릿 및 민간 복사 생성자

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(){} 
}; 

내 클래스의 두 인스턴스를 비교하려고 할 때 컴파일러는 복사기가 비공개이므로 대신 함수 템플릿에 대한 참조를 전달하려고했으나 작동하지 않습니다. 어떤 아이디어?

+0

패스 CONST 참조. –

+0

참조에 대해 정확히 무엇을 시도했으며 어떻게 작동하지 않았습니까? – delnan

+0

복사 할 수없는 개체를 복사합니다. 컴파일러가 복사 생성자에 대해 "고함을 지르는 이유"를 묻습니다. –

답변

6

당신은 템플릿이 참조를 수행 할 수 있습니다 :

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

이 방법에는 복사본이 포함되지 않습니다.

+0

고맙습니다. 내 참조로 const 전달하는 것을 잊었습니다. – Kernael

0

만들려는 매개 변수의 복사본이 필요한 값으로 전달 중입니다. 그래서 복사본을 생성해야하므로 복사 생성자가 필요합니다. 참조 또는 포인터로 전달하면 여기에서 도움이됩니다.

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

또는

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

템플릿 값과 클래스의 복사 ctor에 의해 전달 된 개체를위한 객체 참조를 기대한다; 컴파일러는 기본 Ctor를 사용하려고 시도하고 도움을 요청하는 비명을 찾지 않기 때문에 Ctor를 사용하려고 시도합니다.

솔루션 :

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