0

テンプレートが int、double、または string のいずれであるかをユーザーが選択できるようにしようとしています。しかし、私のメソッドには継承の問題があります。If ステートメントを使用してクラス テンプレート オブジェクトを初期化しているため、メソッド呼び出しを行うたびにコンパイラがエラーをスローします。

template<class T>
class foo {
    private:
        int bar
    public:
        void setBar(int newBar);

};
template<class T>
void foo<T>::setBar(int newBar) {
    bar = newBar;
}
int main() {
    int inputType;
    cout << endl << "1 for integer, 2 for double, 3 for strings." << endl <<
            "What kind of data do you wish to enter?(1-3): ";
    cin >> inputType;
    if(inputType == 1) {
        foo<int> v1;
    } else if(inputType == 2) {
        foo<double> v1;
    } else if(inputType == 3) {
        foo<string> v1;
    } else {
        cout << "Error - Please enter in a proper #: ";
    }
    //Compiler Error
    v1.setBar(3);
    return 0;
}

このようにしているので、 を呼び出そうとするたびに「v1 はこのスコープで宣言されていませんでした」というエラーが表示されますsetBar()。これを乗り越えて、ユーザーがメソッド呼び出しを選択して許可できるようにするにはどうすればよいですか? テンプレートを使用していない場合は、if ステートメントの前に宣言するだけでよいことはわかっていますが、テンプレートを使用すると、コンパイラーは、最初に必要な型を伝えることを要求します。ありがとう!

4

1 に答える 1

2

あなたがそれを試みているので、これはできません。v1最初の問題は、後の使用を含まないスコープでさまざまな変数が定義されていることです。実行できるさまざまな回避策がありますが、最初に思い浮かぶのは次の 2 つです。

  • main の最後のコードがテンプレート化された関数で実装されるようにコードを並べ替え、コード パスに応じて異なる引数でその関数を呼び出します。

template <typename T>
void process() {
   foo<T> v1;
   v1.setBar(3);
}
int main() {
  // …
  switch (input) {
  case 1: process<int>(); break;
  case 2: process<double>(); break;
  default: process<string>(); break;
  };
}
  • 動的ポリモーフィズムを使用します。仮想インターフェイスを使用して基本型を実装し、さまざまなブランチ内で (インターフェイス型から継承する) テンプレートの 1 つをインスタンス化し、それに応じてポインターを設定します。
于 2013-11-12T04:21:35.070 に答える