2012-02-05 19 views
0

みなさんこんにちは!C++:テンプレート:部分的な特殊化:すべてのテンプレートを印刷

次のコードを持つ:

template<typename T, typename OutStream = std::ostream> 
struct print 
{ 
    OutStream &operator()(T const &toPrint, OutStream &outStream = std::cout) const 
    { 
     outStream << toPrint; 
     return outStream; 
    } 
}; 

template<typename T, typename Index = unsigned int, typename CharType = char, typename OutStream = std::ostream> 
struct print<T *, Index> 
{ 
    print(CharType delimiter = ' '): delimiter_(delimiter) {} 
    OutStream &operator()(T const *toPrint, Index startIndex, Index finishIndex, OutStream &outStream = std::cout) const 
    { 
     for (Index i(startIndex) ; i < finishIndex ; ++i) 
      outStream << toPrint[i] << delimiter_; 
     return outStream; 
    } 
protected: 
    CharType delimiter_; 
}; 

コンパイラ:MSVCPP10

コンパイラの出力:

1>main.cpp(31): error C2764: 'CharType' : template parameter not used or deducible in partial specialization 'print<T*,Index>' 
1>main.cpp(31): error C2764: 'OutStream' : template parameter not used or deducible in partial specialization 'print<T*,Index>' 
1>main.cpp(31): error C2756: 'print<T*,Index>' : default arguments not allowed on a partial specialization 

私はこだわっています。私は部分的な専門化を完了するのに役立ちます。

ありがとうございます!

+3

私は([プリティプリンタライブラリ]であなたは興味があります。http: //stackoverflow.com/questions/4850473/pretty-print-c-stl-containers)? –

+0

*特殊な*ケースでは、何かを専門にすることができます。あなたの 'T *、Index'フォームは"もっと特別な "ものではなく、まったく異なっています。 –

+0

@KerrekSBありがとう、あなたが提案したプロジェクトは非常に面白いです! – DaddyM

答えて

1

私は、これはあなたが何を意味するかであると仮定します(これは正しくないコードであってもよい、私はあなたが書いたものを翻訳しようとしている)

template<typename T> struct print<T*, unsigned int> { 
    typedef unsigned int Index; 
    typedef std::ostream OutStream; 
    typedef char CharType; 
    print(CharType delimiter = ' '): delimiter_(delimiter) {} 
    OutStream &operator()(T const *toPrint, Index startIndex, Index finishIndex, OutStream &outStream = std::cout) const { 
    for (Index i(startIndex) ; i < finishIndex ; ++i) 
     outStream << toPrint[i] << delimiter_; 
    return outStream; 
    } 
protected: 
    CharType delimiter_; 
}; 

コンパイラは何が悪かったのかを説明します。

部分的な特殊化では使用できないデフォルトの引数

typename Index = unsigned intのようなものは、特殊でないテンプレートにしか表示されません。

あなたはこの部分にすべてのパラメータを使用する必要があります意味部分特殊で

を使用したり、推論しませ

テンプレートパラメータ:struct print<HERE>

+0

素晴らしい!できます! – DaddyM

関連する問題