2017-12-29 38 views
2

클래스 정의에서 템플릿 클래스 ctor의 인라인 정의를하려고합니다 (내부에서 할 수 있지만 헤더 파일에서 외부로 수행하는 것이 더 좋습니다). 그러나 MSVC는 Matrix에 ctor 정의에 템플릿 인수 목록이 필요하다고 말하고 있습니다 ... 클래스 내부 함수를 정의하여이 문제를 쉽게 해결할 수 있습니다 (여전히 인라인 됨). 심미적 인 이유. 이 문제를 해결할 방법이 있습니까?템플릿 클래스 정의에서 인라인 함수를 정의합니다.

// .hpp 

#pragma once 

template <typename T, size_t rows, size_t cols> 
class Matrix { 
private: 
    constexpr size_t m_size = rows * cols; 
    std::array<T, m_size> m_arr; 
public: 
    __forceinline Matrix(); 
}; 

Matrix::Matrix() : m_arr() { // this gives errors 
    // do ctor stuff 
} 

답변

2

그러나, MSVC는 ctor에 정의 템플릿 인수 목록 ...

Matrix::Matrix() : m_arr() { // this gives errors 

나를 매트릭스가 필요하다고 말하고있다 당신은 정의를 제공해야 템플릿 사양을 놓친 컴파일러 메시지에서 알 수있는 것입니다.

template <typename T, size_t rows, size_t cols> // <<<< This! 
Matrix<T,rows,cols>::Matrix() : m_arr() { 
    // ^^^^^^^^^^^^^ ... and this 
    // do ctor stuff 
} 

...하지만 난 헤더 파일에 외부 그것을 할 것을 선호 ...

그렇게 atomatically에 의해 번역 단위로 포착되지 않는 파일로 정의를 넣어 당신의 시스템 구축 (예. .icc 또는 .tcc과 같은 일부 확장자), 그리고 #include은 템플릿 클래스 선언을 포함하는 헤더의 끝에 하나입니다.

전체 코드는

Matrix.hpp

#pragma once 
#include <cstddef> 

template <typename T, std::size_t rows, std::size_t cols> 
class Matrix { 
private: 
    constexpr static std::size_t m_size = rows * cols; 
    std::array<T, m_size> m_arr; 
public: 
    __forceinline Matrix(); 
}; 

#include "Matrix.icc" 

Matrix.icc

template <typename T, std::size_t rows, std::size_t cols> 
Matrix<T,rows,cols>::Matrix() : m_arr() { 
    // do ctor stuff 
} 
과 같아야합니다
관련 문제