2017-08-20 21 views
-2

問題:コンパイラは、クラスメンバ関数のローカル変数が "このスコープで宣言されていませんでした"と思われる一見無意味なエラーを宣言します。以下に示すコードは元の関数の単純化された実装ですが、何らかの理由でそれでも同じエラーが発生します。さらに、変数の名前を変更したときにエラーが消え、変数を元の名前(「マイナー」)に戻すとすぐにエラーが再開されます。私はこの振る舞いを理解しておらず、コンパイラにこれをさせる原因となる情報や投稿を見つけることができません。誰かが間違っているかもしれないことについて親切に提案してくれますか?私のコードのどこかに大きなバグがあることを示していますか(Matrixクラス定義など)?奇妙な宣言されていない変数コンパイラエラー

詳細:私はLinuxのMint 18で、g ++を使ってMakefilesでCMakeで生成しています。さまざまなコンパイラオプション(-O2、-Wallなど)を使用して試してみましたが、結果は変わりません。私は以前にMinGWを使って、このコード/プロジェクトの少し前のバージョンをWindows 7上でコンパイルして実行しましたが、問題なしでMakefileを書きました。私はリクエストに応じて追加の詳細を提供しています。 Matrix.cppから

修飾/ミニマルコードスニペット:

Matrix Matrix::BuildCofactorMatrix() const { 
    double minor (0.0); 
    minor = 1.0; 
    return Matrix(height_, width_); 
} 

警告メッセージ:編集

/PATH-TO-PROJECT-ROOT/src/Matrix.cpp: In member function ‘Matrix Matrix::BuildCofactorMatrix() const’: /PATH-TO-PROJECT-ROOT/src/Matrix.cpp:1123:5: error: ‘minor’ was not declared in this scope minor = 1.0;

2017年8月21日

私は不要なコードを除去し、そして問題の真に「最小限で完全で検証可能な」例を作成しました。私の場合、エラーはiostreamライブラリの機能のようです。 iostreamのインクルードを削除すると、問題は消えてしまいます。ただし、エラーはコンパイルに使用されるC++標準にも依存します。たとえば、-std = C++ 11や-std = C++ 14などのg ++​​の使用を指定すると問題は解決しますが、仕様(g ++ -c Matrix.cppなど)を削除するとエラーが消えます。ちなみに、私はg ++ 4:5.3.1-1ubuを使っています。

iostream、istream、ostream、またはiosでマクロを見つけることができない場合は、「マイナー」という言葉がありますが、おそらくそれはインクルードチェーンをさらに上回っています...?

Matrix.hpp:

#ifndef MATRIX_HPP 
#define MATRIX_HPP 

class Matrix { 
    public: 
     void BuildCofactorMatrix() const; 
}; 

#endif 

Matrix.cpp:

#include "Matrix.hpp" 
#include <iostream> 

void Matrix::BuildCofactorMatrix() const { 
    double minor (0.0); 
    minor = 0.0; 
} 
+1

[MCVE]を準備してください。 – user0042

+1

* Matrix.cppの修正/ミニマリストコードスニペット:* - そうではありません。このエラーを引き起こすためにあなたのプログラムに潜んでいるかもしれない悪意のあるマクロまたは同様の構成が何を知っているか。 – PaulMcKenzie

答えて

2

私は、関数の前に#define minor(x) (x)を追加することによって、問題を複製することができます。

マクロはminor(0.0)と一致しますが、「パラメータ」を除いてminorと一致しません。

ライン

double minor (0.0); 

は有効な、しかし役に立たない、型キャストである

double (0.0); 

に置き換えられます。

したがって、インクルードファイルの1つでいくつかの悪質なマクロを探してください。

+0

コードを単純化し、定義済みのマクロを検索した後、Q&Aで問題を解決しました。 roc645

関連する問題