2016-05-03 17 views
2

タイプではなくテンプレートのエイリアスを作成しようとしていますが、構文を見つけることができません。以下は私の問題を示す例です。私の推測ではこれはできないことですが、誰かが私を間違っていると証明できることを願っています。それができない場合、これを行うには意味がないいくつかの根本的な理由はありますか、それとも実装されていませんか? Direction::OppositeテンプレートへのC++エイリアス?

template <class S> 
class Down; 

template <class S> 
class Up { 
    template <class S1> 
    using Opposite = Down<S1>; 
}; 

template <class S> 
class Down { 
    template <class S1> 
    using Opposite = Up<S1>; 
}; 

template <template <typename> class Direction> 
void oneDirection() { 
    //Call another function here that uses the template argument as a template 
} 

template <template <typename> class Direction> 
void bothDirections() { 
    oneDirection<Direction>(); 
    oneDirection<Direction::Opposite>(); //This doesn't compile 
} 

int main() { 
    bothDirections<Up>(); 
} 
+0

コンパイルしていないと表示された行に 'typename'がありません。 – KyleKnoepfel

+0

@KyleKnoepfel 'Opposite'もテンプレート引数を必要とするテンプレートなので、' typename'だけで問題を解決することはできません。 –

答えて

3

Direction::(あなたはそれテンプレートの特殊作ってそれに必要なテンプレート引数を与える必要があるだろう)ネストされた名指定子であり、それは確かにクラステンプレートを表すことができません。

私は、そのフォームを許可しない理由の1つは、クラステンプレートに部分的または明示的な特殊化を持たせることができるということです。これにより、プライマリテンプレートとは異なるメンバーを提供できるため、そこには何がありますか?

あなたは2つのテンプレートを関連付けるために特性を使用することによってこの問題を回避することができます

template<class> class Up { }; 
template<class> class Down { }; 

template<template<class> class Direction> struct Direction_traits; 

template<> struct Direction_traits<Up> 
{ 
    template<class S1> using Opposite = Down<S1>; 
}; 

template<> struct Direction_traits<Down> 
{ 
    template<class S1> using Opposite = Up<S1>; 
}; 

template<template<class> class Direction> 
void oneDirection() { 
    //Do something here 
} 

template<template<class> class Direction> 
void bothDirections() { 
    oneDirection<Direction>(); 
    oneDirection<Direction_traits<Direction>::template Opposite>(); 
} 

int main() { 
    bothDirections<Up>(); 
} 

しかし、Direction_traits<Up>::Oppositeは少なくともまだ、Downと同じテンプレートでないことを心に留めておく - 言語ルールが変更される可能性があり将来的にはthis answerの詳細とそのコメントを参照してください。

Upには、形質を使用してoneDirection<Direction_traits<Up>::Opposite>から戻ってくる場合に問題が発生する可能性があります。エイリアステンプレート用に特化された特化はありません。そのような使用を許可するには、少し複雑になる必要があります。可能な解決策が上記の回答に概説されています。

関連する問題