更新 : 2007 年 11 月
エラー メッセージ
構文エラー : 'token1' が 'token2' の前にありません。
予測していたトークン (空白以外の言語要素) 以外のトークンが検出されました。C2143 エラーは別の状況でも発生します。
関数 try ブロックを使用する場合に生成されるこのエラーについては、サポート技術情報の「BUG: Compiler Error C2143 on Function-Try-Block Syntax (Q241706)」を参照してください。
「C++ Language Reference」を参照してコードが構文的に正しいかどうかを確認してください。このエラーは発生した場所よりも後の行で生成されることがあるため、エラー発生行から何行か上のコードも調べてください。
/clr を使用していて、using ディレクティブに構文エラーがあります。
// C2143a.cpp
// compile with: /clr /c
using namespace System.Reflection; // C2143
using namespace System::Reflection;
/clr なしで CLR 構文を使用して、ソース コード ファイルをコンパイルしようとしています。
// C2143b.cpp
ref struct A { // C2143 error compile with /clr
void Test() {}
};
int main() {
A a;
a.Test();
}
if ステートメントの直後の空白以外の文字は左かっこにする必要があります。それ以外の場合、コンパイラでは変換できません。
// C2143c.cpp
int main() {
int j = 0;
// OK
if (j < 25)
;
if (j < 25) // C2143
}
エラーが検出された行か、その数行前の行に、右中かっこ (})、右かっこ ())、またはセミコロン (;) を付け忘れています。
// C2143d.cpp
// compile with: /c
class X {
int member1;
int member2 // C2143
} x;
クラス宣言のタグが無効です。
// C2143e.cpp
class X {
int member;
} x;
class + {}; // C2143 + is an invalid tag name
class ValidName {}; // OK
ステートメントにラベルが付いていません。ラベルだけを置く必要がある場合 (複合ステートメントの最後にラベルを置く場合など) は、null ステートメントを使ってください。
// C2143f.cpp
// compile with: /c
void func1() {
// OK
end1:
;
end2: // C2143
}
標準 C++ ライブラリ内の型に対して非限定の呼び出しが行われています。
// C2143g.cpp
// compile with: /EHsc /c
#include <vector>
static vector<char> bad; // C2143
static std::vector<char> good; // OK
typename キーワードがありません。
// C2143h.cpp
template <typename T>
struct X {
struct Y {
int i;
};
Y memFunc();
};
template <typename T>
X<T>::Y X<T>::memFunc() { // C2143
// try the following line instead
// typename X<T>::Y X<T>::memFunc() {
return Y();
}
明示的なインスタンス化を定義しようとしています。
// C2143i.cpp
// compile with: /EHsc /c
// template definition
template <class T>
void PrintType(T i, T j) {}
template void PrintType(float i, float j){} // C2143
template void PrintType(float i, float j); // OK