0

OpenGL을 배우려고 할 때 벡터와 행렬을 구현하는 간단한 클래스를 작성했습니다. I는 다음과 같이 행렬 및 벡터 클래스가 : 나는 내부 m_data 멤버에 액세스 할 수 있도록 원하기 때문에템플릿 친구 기능의 부분적 특수화가 작동하는 이유는 무엇입니까?

// Forward declarations 
template <typename T, size_t N/*len*/> struct vec; 
template<typename T, size_t N /*rows*/, size_t M /*cols*/> struct mat; 

// Forward declare *operator for matrix 
// (NxM) matrix multiplied by (MxP) matrix yields (NxP) matrix 
mat<T, N, P> operator* (const mat<T, N, M>& A, const mat<T, M, P>& B); 

template <typename T, size_t N> 
struct vec { 
    public: 
     vec() {} 
     virtual ~vec() {} 
    private: 
     T[N] m_data; 
}; 

template <typename T, size_t N, size_t M> 
struct mat { 
    public: 
     mat() {} 
     virtual ~mat() {} 
     // This is where it gets interesting. By my reading of the rules 
     // of C++11, this counts as a partial specialization of the 
     // operator template, and should not work. 
     // However, it compiles just fine! 
     template <size_t n, size_t m, size_t p> 
     friend mat<T, n, p> operator* (const mat<T, n, m>& A, 
             const mat<T, m, p> &B); 
     // Implementation appears later in the same header file. 
    private: 
     T[N*M] m_data; 
}; 

내가 친구로 * 연산자를 선언,하지만 나는 '매트의 사용자가 원하지 않는 '및'vec '를 사용하여 내부 정보를 확인합니다.

이 코드는 정상적으로 컴파일되어 실행됩니다. 나는 그 행렬 곱셈에 대한 단위 테스트를 가지고 있으며, 잘 작동합니다. 그러나, 나는 심지어 그것이 컴파일되는 이유를 알지 못한다. C++ 템플릿의 규칙을 읽음으로써 * 연산자의 선언은 함수 템플릿의 부분적 전문화로 간주되며 불법입니다.

무엇이 여기에 있습니까?

+1

프로그램을 성공적으로 빌드하는 데 사용한 나머지 코드를 추가하십시오. –

답변

0

밝혀졌습니다. * NOT * 컴파일. 제가 생각할 때 제가 단위 테스트에서 템플릿 스트림 연산자를 호출하지 않았기 때문에 컴파일 중이라고 생각했습니다.

바보 같은 질문에 사과드립니다.