2011-12-07 12 views
0

私は、大きなプロジェクトの一部として使用するためにテンプレートを使用して固定長文字列クラスを作成する必要があるが、固定長文字列を使い始めるには問題があります。私はここで助けに来ると思った。私は、私の問題の原因となっているテンプレートに関する多くの経験がありません。私の現在の問題は、私に対処方法がわからないエラーを出すコピーコンストラクタにあります。だからここに私のクラスの定義です:テンプレートを使用した固定長文字列

template <int T> 
    class FixedStr 
    { 
    public: 
          FixedStr  (); 
          FixedStr  (const FixedStr<T> &); 
          FixedStr  (const string &); 
          ~FixedStr  (); 
     FixedStr<T> &  Copy   (const FixedStr<T> &); 
     FixedStr<T> &  Copy   (const string &); 

    private: 
     string Data; 
    }; 

そして、ここでは私に問題を与えているコピーコンストラクタです:

template <int T> 
    FixedStr<T>::FixedStr (const string & Str) 
    { 
     if (Str.length() == <T>) 
      strcpy (FixedStr<T>.Data, Str); 
    } 

は、誰も私にこれを処理する方法に関していくつかのアドバイスを与えることはできますか?簡単にエラーが表示されるのですか、または問題に近づいていますか?あなたが私に与えることができるお手伝いをありがとう。

+1

'Str.length()== T'である必要があります。山括弧は、テンプレートパラメータの取得には使用されません。 – Philipp

+2

'std :: string'をラップすると、固定長の文字列IMOの全体が欠落しています。フリーストアの割り当てを避け、' std :: string'は内部的にフリーストアの割り当てを使います。 – ildjarn

+1

@ildjarn:これは、実際のプロダクション用に固定長の文字列クラスを書くのではなく、テンプレートの仕組みを学ぶためのものだと思います。 – Philipp

答えて

3

未テスト:私はそれが

if (Str.length() == T) 
     Data = Str; 

まずすべきだと思いますテンプレート引数にアクセスするとき、あなたは山括弧を使用しないでください。次に、C++の文字列にstrcpyを使用せず、割り当てによるコピーをサポートします。

クラスにカスタムデストラクタやコピーコンストラクタは必要ないことに注意してください。

通常、タイプパラメータにはTという文字が使用されます。私は代わりにLengthまたはNを代わりに使用します。それはタイプを変更していますしない限り、角括弧でTを入れる必要はありません

#include <string> 

template<int N> class FixedStr { 
public: 
    FixedStr(const std::string&); 

private: 
    std::string Data; 
}; 

template<int N> FixedStr<N>::FixedStr(const std::string& Str) { 
    if (Str.length() == N) Data = Str; 
} 

int main() { 
    FixedStr<11> test("Hello World"); 
} 
+0

ご協力いただきありがとうございます。これは私の問題を解決し、私のコードを短縮しましたので、今度は私のプロジェクトにはもう問題はありません。再度、感謝します。 – triple07

1

:ここ

は、あなたのクラスの修正版です。したがって、それはStr.length() == Tでなければなりません。

stringstrcpyを使用することはできません。互換性のあるNULL終了文字列を取得するには、c_str()メソッドを使用する必要があります。とにかくstringオブジェクトを割り当てるのにstrcpyを使用すべきではないので、それは重要ではありません。ちょうどData = Strを使用してください。

+0

申し訳ありませんが、私はしばらくページを開いていて、編集を見るためにリフレッシュしませんでした。 –

関連する問題