2017-12-05 5 views
0

テンプレートクラスを2つのファイルに分割したいのですが、通常のクラスは、宣言があるところは.hpp、実装は.ippです。テンプレート定義とインスタンス化をhppファイルとippファイルに分割するにはどうすればいいですか

これは通常の方法で動作しています。しかし、それ自身がテンプレートであるメソッドでは、私はいくつかの問題に直面しています。

次の構造を使用する:

#ifndef MATRIX_HPP 
#define MATRIX_HPP 

#include <array> 
#include <type_traits> 

template<typename t, 
     std::size_t m, 
     std::size_t n> 
class Matrix 
{ 

static_assert(std::is_arithmetic<t>::value, 
        "Matrix can only be declared with a type where std::is_arithmetic is true."); 
public: 
    Matrix(); 

    template<std::size_t y, std::size_t x, std::size_t p, std::size_t q> 
    Matrix<t, p, q> slice() const; 

private: 
    std::array<std::array<t, n>, m> data{}; 
}; 

#include "Matrix.ipp" 

#endif 

Matrix.ipp:

:私はこれをコンパイルするとき

#include "Matrix.hpp" 

template<typename t, std::size_t m, std::size_t n> 
Matrix<t, m, n>::Matrix() 
{} 

template<typename t, 
     std::size_t m, 
     std::size_t n, 
     std::size_t y, 
     std::size_t x, 
     std::size_t p, 
     std::size_t q> 
Matrix<t, p, q> Matrix<t, m, n>::slice() const 
{ 
    auto mat = Matrix<t, p, q>(); 

    for (std::size_t i = y; i < m; i++) 
    { 
     for (std::size_t j = x; j < n; j++) 
     { 
      mat[i - y][j - x] = (*this)[i][j]; 
     } 
    } 

    return mat; 
} 

main.cppに

#include "Matrix.hpp" 

int main() { 
    auto m = Matrix<3, 3, int>(); 
    auto sliced = m.template slice<1, 1, 2, 2>(); 

    return 0; 
} 

は、今では、次のメッセージで失敗します

../Matrix.ipp:14:17: error: prototype for ‘Matrix<t, p, q> Matrix<t, m, n>::slice() const’ does not match any in class ‘Matrix<t, m, n>’ 
Matrix<t, p, q> Matrix<t, m, n>::slice() const 
       ^~~~~~~~~~~~~~~ 
In file included from ../main.cpp:0:0: 
../Matrix.hpp:20:18: error: candidate is: template<class t, long unsigned int m, long unsigned int n> template<long unsigned int y, long unsigned int x, long unsigned int p, long unsigned int q> Matrix<t, p, q> Matrix<t, m, n>::slice() const 
    Matrix<t, p, q> slice() const; 

コンパイラがそれを認識しないので、これをどう扱うかわかりません。これを修正する方法はありますか?

誰かが私を助けてくれることを願っています。ありがとう!また、あなたが実際に混乱している含まれていることに注意してください

template<typename t, std::size_t m, std::size_t n> 
template<std::size_t y, std::size_t x, std::size_t p, std::size_t q> 
Matrix<t, p, q> Matrix<t, m, n>::slice() const 
{ 

+0

@ user0042通常の方法では上記のMyメソッドは動作しません。テンプレートメソッドのみが機能しません。 –

+0

@ user0042問題は定義の欠落を含むものではありません。ヘッダーには ".ihh"ファイルが含まれています。問題は、定義の点で2組のテンプレート引数を提供することです。 –

+0

@JohnSmith私がリンクしている複製を見てください。関数を定義するときには、2つの異なる 'template'引数セットを用意する必要があります。それらを1つの大きなテンプレート引数セットに結合することはできません。 –

答えて

0

あなたはテンプレートパラメータの二組を定義する必要があります。行列クラステンプレートのための1つを、マトリックスクラス機能のための別のは、一つの長いリストにそれらをマージしませんアップ。 "Matrix.hpp"の "Matrix.ipp"が既に含まれているため、 "Matrix.hpp" を.ippファイルに含めても機能しません。これでエラーは発生しません。

関連する問題