2017-12-29 64 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はあなたが定義のために与えられるべきであるテンプレートの指定を逃した

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

...行列がCTOR定義にテンプレート引数リストが必要であることを私に言っていますそれはおそらく、コンパイラのメッセージがあなたに伝えるものです:

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(テンプレートクラス宣言を含むヘッダーの末尾に1つ)

完全なコードは

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 
} 
のようになります。
関連する問題