2017-02-15 5 views
2

私のクラスには、テンプレートを持つクラスであるT1とT1のテンプレートのパラメータであるT2の2つの型パラメータを取得する必要があります。 。ネストされたテンプレート(テンプレート<typename T <typename templateArgumentFor_T >>)

私の場合、頂点タイプ(2つは1つを継承します)と頂点タイプ(私の場合はID)のデータ型です。

私はこのような何かを書くことができるようにしたい:

(私にエラーました:C2143構文エラー:「<」の前に行方不明に「」)
template < typename VertexType < typename VertexIDType > > 

だから

私のクラス

class Graph 
{ 
public:  
    Graph(const List<VertexType<VertexIDType>>& verticesList); 
    VertexType<VertexIDType>& getVertexByID(const VertexIDType& ID) const; 

private:  
    List<VertexType<VertexIDType>> vertices; 
}; 

( 'リスト' のリンクリストのための私の(ないのSTDの)実装です。)

:このようなものになるだろう

このtemplate < typename VertexType < template <typename VertexIDType> > >

(も(「<」が見つかり、テンプレート引数リストを終了するために「>」C2947が予期)私もtemplate <typename VertexType, typename VertexIDType> を試してみましたが、その後、私は機能Graph(const List<VertexType<VertexIDType>>& verticesList); にエラーが発生しました私にエラーC2143を与えました)

私は本当に自分自身ですべてを理解しようとする人ですが、このはイライラしています。自分のコードに実装するかどうかを理解した答えが見つかりませんでした。 私はOOP(C++)コースを終了しました。私はテンプレートについていくつかの経験があります。私は1つまたは2つの引数を正常に取得するテンプレートを書きましたが、このようなものはありません。

好ましくはできるだけエレガントに、私はこの問題を解決する助けてください:)

感謝を。

答えて

3

あなたは、テンプレートテンプレートパラメータを使用することができます。

template <template <typename> class VertexType, typename VertexIDType> 
class graph; 

graph<MyVertexType, MyVertexIDType> //usage 

代わりにあなただけの種類を取り、部分特殊でIDタイプを抽出できます。

template <typename Vertex> 
class graph; 

template <template <typename> class VertexType, typename VertexIDType> 
class graph <VertexType<VertexIDType>> { 
    //... 
}; 

graph<MyVertexType<MyVertexIDType>> //usage 
+0

ありがとうございました! –

1

TartanLlamaの答えはのために良いものですあなたが尋ねた質問ですが、アプローチを少し変更したいかもしれません。あなたが必要な場合VertexTypeはtypedefでVertexIDTypeを定義しなければならないことを、あなたは書くことができます:

template <class VertexType> 
class Graph 
{ 
public:  
    Graph(const List<VertexType>& verticesList); 
    typedef typename VertexType::VertexIDType VertexIDType; 
    VertexType& getVertexByID(const VertexIDType& ID) const; 

private:  
    List<VertexType> vertices; 
}; 

注VertexIDTypeのtypedefでtypenameを。 「この名前はでなければならず、変数ではない」と言う必要があります。

は、あなたの現在のVertexTypeはVertexIDType上でテンプレート化されたと仮定すると:

template <classname VertexIDType> 
struct VType1 { 
    double stuff; // Or whatever you have in your vertex 
}; 

は、あなたがそれを変更する必要があります:

template <classname VertexIDType> 
struct VType1 { 
    double stuff; 
    typedef VertexIDType VertexIDType; // Provide a typedef for VertexIDType. 
}; 

これは標準ライブラリがかかるアプローチは、すべてのタイプに似ていますコンテナvalue_typeなどのtypedefを持っています。

+0

"typedef typename"の定義について詳しく説明できますか?私は構文を理解していませんでした。最初の「VertexIDType」は何を表していますか? "VertexType"の定義のように見えるでしょう(どこにあると思いますか、 "::")? 2番目の「VertexIDType」は何を表していますか? また、私のコードでは "VertexIDType"は "VertexType"で定義されていません。それはちょうどそこにテンプレート引数として示されています。それはクラスではありません。将来的に必要になる場合は、int、long、char、stringなど、または非標準型(クラス)を表します。 –

+0

したがって、VertexTypeを* VertexIDType *が定義されるように変更することが考えられます。私の編集は助けになるのですか? –

+0

@DrorFelman:VertexIDTypeはVertextTypeのテンプレート引数ですか?もしそうなら、それはさらに簡単になります。 –

関連する問題

 関連する問題