1

次のコードの抜粋は、不可解な MSVC++ コンパイラ エラーの原因です。

template<class T> class Vec : public vector<T>{
  public:
    Vec() : vector<T>(){}
    Vec(int s) : vector<T>(s){}

    T& operator[](int i){return at(i);  }
    const T& operator[](int i)const{ return at(i);}
};

...

エラー:

test.cpp(5) : error C2143: syntax error : missing ',' before '<'
  test.cpp(12) : see reference to class template instantiation 'Vec<T>' being compiled

これを修正するにはどうすればよいですか?

- -編集 - -

いくつかのコンテキスト:

The C++ Programming Languageから本質的にコピーして貼り付けたコードをコンパイルしようとしています。私はまだこのコードを完全に理解していません。ただし、その目的は、一部のコードがベクターの範囲外の項目にアクセスしようとしたときに、単に正しくない値を返すのではなく、例外をスローするベクター型を実装することです。

4

3 に答える 3

3

試す

template<class T> class Vec : public vector<T>{
  public:
    Vec() : vector(){} // no <T>
    Vec(int s) : vector(s){} // same

    T& operator[](int i){return at(i);  }
    const T& operator[](int i)const{ return at(i);}
};

テンプレート クラスのコンストラクタの名前には、テンプレート シグネチャが含まれていません。

補足として、2番目のコンストラクターは実際には

Vec(typename vector<T>::size_type s) : vector(s){} // not necessarily int

最後に、非仮想デストラクタがあるため、vector から派生させるべきではありません。ベクトルへのポインターを介して Vec を削除しようとしないでください。

于 2009-04-07T13:48:43.123 に答える
1

ベクトルから継承しようとしているのはなぜですか? これにより、多くの問題が発生します。少なくとも、そのベクトルには仮想デストラクタがありません。これにより、クラスへのポリモーフィック参照を削除するときに間違ったデストラクタが呼び出され、メモリ リークや一般的な不適切な動作が発生します。

たとえば、次のコードは ~Vec() を呼び出しませんが、代わりに ~vector() を呼び出します。

vector<int> *pVec = new Vec<int>();
delete pVec;  // Calls ~vector<T>();

ただし、実際に表示されるコンパイル エラーは、基本コンストラクターの呼び出しにテンプレート構文を使用しているためです。それを削除するだけでコンパイルできます

Vec() : vector() {}
于 2009-04-07T13:47:24.703 に答える
0

MSDNから: コンパイラ エラー C2143 (C++)

標準 C++ ライブラリ内の型に対して非修飾呼び出しが行われます。
// C2143g.cpp
// compile with: /EHsc /c
#include <vector>
static vector<char> bad;   // C2143
static std::vector<char> good;   // OK

これはちょうど私を噛みました。への参照を修正してvector<T>、 に置き換えるだけstd::vector<T>です。

于 2010-11-22T05:53:29.690 に答える