コンパイラ エラー C2143
構文エラー: 'token2' の前に 'token1' がありません
コンパイラでは、特定のトークン (つまり、空白以外の言語要素) が必要ですが、代わりに別のトークンが見つかりました。
C++ 言語リファレンスを確認して、コードが構文的に正しくない場所を確認します。 コンパイラは、問題の原因となる行を検出した後にこのエラーを報告する可能性があるので、エラーの前にあるコード行を確認します。
C2143 は、さまざまな状況で発生する可能性があります。
この例のように、名前を修飾できる演算子 (::
、->
、.
) の後に キーワード template
を指定する必要がある場合に発生する可能性があります。
class MyClass
{
template<class Ty, typename PropTy>
struct PutFuncType : public Ty::PutFuncType<Ty, PropTy> // error C2143
{
};
};
既定で、C++ では Ty::PutFuncType
がテンプレートではないと見なされます。したがって、次の <
は小なり記号として解釈されます。 正しく角かっこを解析できるよう、PutFuncType
がテンプレートであることを明示的にコンパイラに伝える必要があります。 このエラーを修正するには、次に示すように、依存型の名前に template
キーワードを使用します。
class MyClass
{
template<class Ty, typename PropTy>
struct PutFuncType : public Ty::template PutFuncType<Ty, PropTy> // correct
{
};
};
C2143 は /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
}
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
C プログラムでは、変数は関数の先頭で宣言する必要があり、関数が非宣言命令を実行した後で宣言することはできません。
// C2143j.c
int main()
{
int i = 0;
i++;
int j = 0; // C2143
}