この特殊な機能を機能させる方法

c++ templates
この特殊な機能を機能させる方法

これが契約です。 私はこのフォーラムを調べましたが、検索している情報が見つからなかったか、問題についてそれを繰り返すことができないでしょう。 汎用のテーブルTableがあり、MyStringというクラスがあります。

template
class Table {
    public:
        TableauGenerique() : index_(0) { //On initialise courant à 0
        }
        void add(typeGen type);
    private:
        typeGen tableGen_[DIM];
        int index_;
};

私の問題は追加機能にあります。 私は時々main.cppでこれをしなければなりません:(これはうまくいきます)

 Table  tabFloat;
    tabFloat.add(1.6564);

ある時点で、MyStringのオブジェクトを作成して文字列を渡し、オブジェクトを配列(tableGen)に保存するためにadd関数を特殊化する必要があるため、これを実行する必要があります。

TableauGenerique  tabString;

だから、私はこれを(授業の後)成功せずに試しました。

template
void Table::add(typeGen type){ //Which is the generic one for float or ints
    if(index_ < DIM) {
        tableGen_[courant_] = type;
        index_++;
    }
}

template
void Table::add(typeGen type) { //(line 75) Which is the specific or specialized function for myString
    MyString str(type);
    if(index_ < DIM) {
        tableGen_[courant_] = str;
        index_++;
    }
}
だから、それがまったくコンパイルされないため、どうすればこれを動作させることができます:line75:error: ‘<‘トークンの前に初期化子が期待され、主にTable

add(const char [6 ])、

すべてが十分に明確であることを願っています。 何か不明な点がある場合はお知らせください。

ご助力ありがとうございます !

  0  0


ベストアンサー

template
void Table::add(typeGen type)

実際には関数テンプレートではないのに、 `add()`を特殊化しようとしています。 それがどのように機能すると思いますか?

” ” ‘

あなたはおそらく:(クラスの専門化)

template
void Table::add(string type)

ただし、これは、クラス自体を専門とする場合にのみ許可されます。 クラスを特殊化しないと、上記のコードはコンパイルエラーになります!

編集:

次のオンラインチュートリアルを読むことができます。

2


MyString`クラスのコードを制御できる場合、 float`から `MyString`への暗黙的な変換として機能するコンストラクターを提供できます。 例:

#include
#include
#include

class MyString {
public:
  MyString(float number) {
    std::stringstream buffer;
    buffer << number;
    value = buffer.str();
  }

  void print() {
    std::cout << value << std::endl;
  }
private:
  std::string value;
};

template
class Foo {
public:
  void DoStuff(T item) {
    item.print();
  }
};

int main() {
  Foo foo;

  foo.DoStuff(1.342); // implicitly converts float to MyString

  return 0;
}

この方法では、addメソッドの特殊化は必要ありません。 ただし、暗黙的な変換は扱いにくいため、誤って変換しないように注意してください。また、あいまいさが生じる可能性があります。

0


編集:再考すると、以下の私の提案は基本的にと同等です

Table tabString;
tabString.add(MyString("whatever"));

したがって、過度におよび/または問題を解決しません。 無視してください:)

” ” ‘

クラスTableをジェネリックメソッドで拡張して、目的のタイプのオブジェクトを構築できるものを追加します。

template
class Table {
    public:
        Table() : index_(0) {}
        void add(typeGen type);
        // The additional method
        template void add(const T& src);
    private:
        typeGen tableGen_[DIM];
        int index_;
};

template
template
void Table::add(const T& src) {
    if(index_ < DIM) {
        tableGen_[courant_] = typeGen(src);
        index_++;
    }
}

割り当て前の一時的なtypeGenオブジェクトの構築に注意してください。 MyStringオブジェクトが文字列リテラルから構築できると仮定します。 const char *から、次のように使用できます。

Table tabString;
tabString.add("whatever");

または、上記の仮定が間違っている場合、以下がおそらく機能するはずです(ストリングインスタンスからMyStringインスタンスを構築したため)。

tabString.add(string("whatever"));

0


タイトルとURLをコピーしました