2009-04-07 9 views
1

次のコードは、不可解なMSVC++コンパイラのエラーに責任がある:MSVC++コンパイラエラーC2143

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 

が、私はこれをどのように修正すればよいですか?

---編集---

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

私は基本的にコピーして、C++プログラミング言語から貼り付けコードをコンパイルしようとしています。私はまだこのコードを完全に理解していません。ただし、不正な値を返すのではなく、ベクトルの範囲外の項目にアクセスしようとすると、例外をスローするベクタータイプを実装することが目的です。

+0

Vecのインスタンス化をお願いします – bayda

+0

あなたのクラスはかなり無意味です。デフォルトでは、MSVCの演算子[]もat()と同様に境界チェックを実行します。実際にクラスに新しいものを追加するのではなく、潜在的なエラーを導入するだけです(JaredParの答えを参照)。 – jalf

答えて

1

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

たとえば、次のコードでは〜Vec()を呼び出さず、代わりに〜vector()を呼び出します。

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

実際のコンパイルエラーは、ベースコンストラクタ呼び出しのテンプレート構文を使用しているためです。単純にそれを削除し、それが

Vec() : vector() {} 
+0

+1。あなたは非ポリモーフィックな削除について警告するのは正しいですが、OTOHは、ベクトルを動的に割り当てるコードはとにかく疑わしいものです。 (私が何かを動的に割り当てるために考えることができる唯一の理由は、実行時までサイズを知らない場合ですが、実行時にはベクトルのサイズが変わる可能性があります。) –

+0

動的に何かを割り当てる主な理由は、あなたが実行時まで持っているアイテムの数やそれらの実際のタイプが何であるかを知らないことです。 –

+1

@ Neeil:一般的には良い点ですが、特定のベクトルの場合:(1)いくつのベクトルがベクトルのベクトルを動的に割り当てるより安全ですか? (2)実際のタイプを知らない:あなたが私に過剰設計のような匂いがしたいと思うベクトルの正確なタイプを知らない。 –

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 

それは非仮想デストラクタを持つ最後に、あなたが本当に、ベクターから派生してはならないはずです。ベクタへのポインタでVecを削除しようとしないでください。

+0

実際、2番目のコンストラクタはVec(size_type s)でなければなりません。これはベクトル内の要素の数であり、ベクトルに入れる要素ではありません。 –

+0

size_type >> size_t –

+1

@Benoît:必ずしもそうではありません。 std :: vectorはsize_typeを定義します。これはsize_tと同じでも異なっていてもかまいません。 –

0

An unqualified call is made to a type in the Standard C++ Library:
// C2143g.cpp 
// compile with: /EHsc /c 
#include <vector> 
static vector<char> bad; // C2143 
static std::vector<char> good; // OK 

MSDN: Compiler Error C2143 (C++)から、これは私だけのビット。あなたは参考文献をvector<T>に修正し、それをstd::vector<T>に置き換えてください。