2016-04-17 19 views
0

で宣言されていなかった私は、次のテンプレート機能のVisual Studio 2015で正常にコンパイルさ変数がこの範囲gccのエラー

//This is a very naive implementation, but it will do 
template<class T> 
T determinant(const std::vector<std::vector<T>> &matrix) 
{ 
    sci::assertThrow(square(matrix), sci::err()); 
    if (matrix.size() == 1) 
     return matrix[0][0]; 
    else if (matrix.size() == 2) 
     return matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0]; 
    else 
    { 
     double result = 0; 
     std::vector<std::vector<double>> minor(matrix.size() - 1); 
     double multiplier = 1.0; 
     for (size_t i = 0; i < matrix.size(); ++i) 
     { 
      for (size_t j = 0; j < minor.size(); ++j) 
      { 
       if (j < i) 
        minor[j] = matrix[j]; 
       else 
        minor[j] = matrix[j + 1]; 
      } 
      result += multiplier * matrix[0][i] * sci::determinant(minor); 
      multiplier *= -1.0; 
     } 
     return result; 
    } 
} 

を持っている、しかし、gccが軽微であるようですが、私には見えます

g++ -c -Wall -g -std=c++11 -fPIC -o3 -o build/svector.o svector/svector.cpp 
In file included from svector/svector_internal.h:6:0, 
       from svector/svector.cpp:1: 
svector/../include/svector/dep/svector.h: In function 'T sci::determinant(const std::vector<std::vector<T> >&)': 
svector/../include/svector/dep/svector.h:2888:28: error: 'minor' was not declared in this scope 
    for (size_t j = 0; j < minor.size(); ++j) 
          ^
svector/../include/svector/dep/svector.h:2895:60: error: 'minor' was not declared in this scope 
    result += multiplier * matrix[0][i] * sci::determinant(minor); 
                  ^

語りますgccが不平を言っている点では間違いありません。誰もこのエラーの理由で光を当てることはできますか? Glibcの中

+1

「#を含む」ことができませんでしたか?いくつかの標準的なライブラリの実装では、他の標準ヘッダファイルが自動的にインクルードされますが、異なる実装ではそうではありません。それがあなたの質問に答えることができないなら、誰もが再現できる[MCVE]を提供してください。 –

+1

[MCVE]を投稿する必要があります。そして、私は本当にそれを言うことに疲れています。 –

答えて

5

sys/sysmacros.hは、マクロ定義が含まれています:

# define major(dev) gnu_dev_major (dev) 
# define minor(dev) gnu_dev_minor (dev) 

これはおそらくあなたが含めているいくつかのシステムヘッダを通じて含まれています。

変数定義内のminorの後にある括弧はマクロ呼び出しを引き起こし、変数名を変更します。 minorの他の用途ではかっこがないため、マクロは呼び出されず、minorは存在しない変数を参照します。

minor変数の名前を変更するか、minorを定義解除してエラーを修正することができます。