2011-04-29 7 views
1

얘들 아, 나는 이와 같은 오버로드 된 템플릿 기능에 액세스하는 방법에 대한 혼란 스러워요 :액세스 오버로드 된 템플릿 함수

template <typename T> 
Matrix(T r, T c) {rows=r; cols=c; elements=new T[r*c];} 

내가했다 : 함수 등으로

template <typename T> 
friend istream& operator>> (istream& in, Matrix& right) 
{ 
     for(int i=0; i<right.rows*right.cols; i++) 
     cin >> right.elements[i]; 
} 

할 수있다

Matrix <double> test(number, number) 

예를 들어, 내가 어떻게 템플릿 >> 연산자를 사용할지 모르겠다 또는 < < 또는 * 또는 + ..) 도움을 주시면 감사하겠습니다. 감사!

+0

더 많은 컨텍스트를 추가해야합니다. 특히 클래스 템플릿 (또는 그 중)에 *있는 멤버 특성 및 기존 코드 *를 비롯한 클래스 템플릿 선언을 추가해야합니다. –

답변

0

난 당신이 형식 인수 T을 가진 클래스 템플릿 Matrix를 선언된다고 가정하고, 당신이 사용하고자하는 정의 operator>> (당신은 질문이 더 명시해야한다) :

template <typename T> 
class Matrix { 
    int rows, cols; 
    T* elements; 
public: 
    Matrix(int c, int r);  // Do you really want the number of 
            // rows/columns to be of type `T`?? 

    // Note: removed template, you only want to befriend (and define) 
    // a single operator<< that takes a Matrix<T> (the <T> is optional 
    // inside the class braces 
    friend std::istream& operator>>(std::istream& i, Matrix& m) 
    { 
     // m.rows, m.cols and m.elements is accessible here. 
     return i; 
    } 
}; 

그리고 나서 사용하기가 아주 쉽습니다.

Matrix<double> m(1, 2); 
std::cin >> m; 

이것은 단지 가장 일반적인 옵션 일뿐입니다. 일반적으로 클래스 템플릿은 위의 코드에서와 같이 단일 템플릿 템플릿이 아닌 다른 함수 템플릿 (모든 템플릿을 인스턴스화하는 경우) 또는 특정 인스턴스를 생성 할 수 있습니다 (템플릿으로 작성되지 않은 함수) (위의 코드에서 operator<< 및라고 생각하십시오. 함수 템플릿.

다른 옵션과 동작에 대한 자세한 설명을 here에 적어 두었습니다.

+0

죄송합니다. 작동하지 않았습니다. right.cols, right.rows ...는 템플릿 typename T 라인이 없으면 액세스 할 수 없다고 주장합니다. – pauliwago

+0

@pauliwago : 당신은 정말로 둘러싸는 클래스 템플릿 선언과 멤버 선언을 컨텍스트와 함께 추가해야합니다. 그렇지 않으면 조명이 꺼진 방의 객 체를 검색하도록 요청하고 있습니다. 'Matrix' 클래스 템플릿 안에서 연산자를 정의하고 있습니까? –

0

음에 액세스 할 수있는 유일한 방법은 다음과 같이이다 :

operator>> <YourType> (istream, param); 

하지만, 물론 그것은 연산자 오버로딩의 모든 장점을 패배. 따라서이 연산자 정의에는 문제가 있습니다. 어쩌면 매트릭스가 템플릿 유형이고 그럴 수 있어야합니다.

template <typename T> 
operator>>(istream & in, Matrix<T> & right); 

연산자 정의에서 템플릿 매개 변수를 사용하지 않아서 뭔가 잘못되었습니다.