13

ネストされたテンプレート クラスの明示的な特殊化の正しい構文を理解しようとしています。次のコードは、よりよく説明します。

struct Column_Major;
struct Row_Major;

template<size_t rows, size_t cols, typename T, typename Allocator>
class Matrix
{

    /* bunch of members */
    template <typename storage = Column_Major>
    class Iterator
    {
        /* bunch of members */
    };
};

の明示的な特殊化を書きたいのですtemplate <> class Matrix<...>::Iterator<Row_Majorが、構文がわかりません。包含クラスである Matrix を明示的に特殊化せずに、Iterator クラスを明示的に特殊化することはできないのではないかと思います。しかし、これを行う方法があれば、とてもうれしいです。

Iterator クラスを Matrix クラスのメンバーではなく別のクラスにすることができることはわかっていますが、クラスをネストすることで、Matrix クラスのテンプレート パラメーターとデータメンバーに完全にアクセスできるようになり、作業が簡素化されます。必要に応じてこれを回避できることはわかっていますが、最初にネストされたアプローチの可能性を調査して理解したいと思います。

ありがとう、シュムエル

4

3 に答える 3

17

明示的な特殊化の場合、内側のクラスの前に外側のクラスを特殊化する必要があります。たとえば、この質問を見ることができます。

部分的な特殊化を使用する回避策があります。

template<size_t rows, size_t cols, typename T, typename Allocator>
class Matrix
{

    //                           Notice the additionnal dummy parameter
    //                                       vvvvvvvvvvvvv
    template <typename storage = Column_Major, bool = true>
    class Iterator
    {
    };

    // Specialization
    template <bool dummy>
    class Iterator<Row_Major, dummy>
    {
    };
};
于 2013-10-29T16:24:27.220 に答える