2017-05-15 14 views
0

MATRIXという単一のパラメータTをとるテンプレートクラスがあります。MATRIXを使用し、T値の出力を返す関数を記述したいと思います。 MATRIXはその実装でelem_typeとしてTをtypedefします。これをやったの私の最初の試み:テンプレートテンプレートパラメータ、内部パラメータが固定されていません

template<template<typename> class MATRIX> 
class MyClass 
{ 
... 
    MATRIX<>::elem_type myfun(const MATRIX<>& m1); 
} 

これはエラーになりますがMATRIX「テンプレートテンプレートパラメータの引数リストは、 『それを見て理にかなっている、』欠けています」。問題は、私は何をそこに置くべきか分からないということです。例えばfloatを指定することはできますが、この関数はMATRIXのパラメータがfloat、double、uint_16なのかどうかに関係なく機能します。 MATRIXのすべての可能なパラメータを具体的に列挙せずにこれを行うことは可能ですか?

+1

は、スタックオーバーフローへようこそ。 [The Tour](http://stackoverflow.com/tour)を読み、[ヘルプセンター](http://stackoverflow.com/help/asking)の資料を参考にしてください。ここに聞いてください。 –

答えて

1

この問題を解決する最も簡単な方法は、MyClassに1つのテンプレートパラメータをとり、それをMATRIXに明示的に特化させることです。

template <typename> 
class MyClass; 

template <template <typename> class MATRIX, typename T> 
class MyClass<MATRIX<T>> 
{ 
    // ... 
    typename MATRIX<T>::elem_type myfun(const MATRIX<T>& m1); 
}; 

live example on wandbox

+0

ご清聴ありがとうございます。ワンドボックスの例は特に役に立ちました。 –

1

テンプレートテンプレートパラメータを持っている場合は、テンプレートテンプレートパラメータをインスタンス化するために使用することができ、別のテンプレート引数を提供することが必要です。

template<template<typename> class MATRIX, typename ElemenType> 
class MyClass 
{ 
} 

次に、あなたが使用することができます。

template<template<typename> class MATRIX, typename ElemenType> 
class MyClass 
{ 
    typename MATRIX<ElementType>::elem_type myfun(const MATRIX<>& m1); 
} 
関連する問題