2010-03-31 4 views
2

이 내 템플릿 매트릭스 클래스입니다!C++ 템플릿과 그 요소의 형태

왜이 경우 컴파일러가 계속 컴파일됩니까?

픽셀 클래스는

#ifndef MYRGB_H 
#define MYRGB_H 

#include <iostream> 
using namespace std; 

class Pixel 
{ 
public: 
    // Constructors 
    Pixel(); 
    Pixel(const int r, const int g, const int b); 
    Pixel(const Pixel &value); 
    ~Pixel(); 

    // Assignment operator 
    const Pixel& operator = (const Pixel &value); 

    // Logical operator 
    bool operator == (const Pixel &value); 
    bool operator != (const Pixel &value); 

    // Calculation operators 
    Pixel operator + (const Pixel &value); 
    Pixel operator - (const Pixel &value); 
    Pixel operator * (const Pixel &value); 
    Pixel operator * (const int &num); 
    Pixel operator/(const int &num); 

    // IO-stream operators 
    friend istream &operator >> (istream& input, Pixel &value); 
    friend ostream &operator << (ostream& output, const Pixel &value); 

private: 
    int red; 
    int green; 
    int blue; 
}; 

#endif 
+1

표시되는 컴파일러 오류를 포함하십시오. 또한 코드를 표시하지 않는 Pixel 클래스를 언급합니다. 매트릭스 클래스에 '/'연산자를 정의하는 것처럼 보입니다. 오른쪽에 T 요소가있는 것입니다. 이 메서드의 본문을 표시하지 않으므로 컴파일러 오류가 예상되는 이유를 알기가 두 배로 어렵습니다. 자세한 내용을 참조하십시오. –

+0

@Neil이 Pixel 클래스를 추가했습니다. 감사. –

+5

헤더에'namespace std'를 사용해서는 안됩니다. – sbi

답변

7

C++ 템플릿은 당신이 그들을 사용하는 시점에서 인스턴스화, 이것은 역시 Matrix<T>::operator/(const T&) 위해 발생된다. 즉, 나누기 연산자를 호출하지 않는 한 컴파일러에서 Matrix<Pixel>을 허용합니다.

+0

나는'Matrix :: operator /'를 언급하지 않고'Matrix '를 참조하는 모든 소스 파일이 계속 컴파일되기 때문에 operator /'를 호출해야합니다. –

0

1) Matrix 연산자의 본문을 제공하지 않았으므로 Pixel/Pixel 연산자가 필요하지 않을 수 있습니다.

2) Afaik, 템플릿 메서드는 코드의 어딘가에서 호출하지 않으면 컴파일 오류를 생성하지 않습니다. 이것이 표준인지 아닌지는 모르겠지만 MSVC의 일부 버전은 이런 식으로 행동합니다.

Matrix m; 
Pixel p; 
m = m/p 

코드의 어딘가에 무엇이 발생하는지 확인하십시오.