2

Cygwinでgcc 3.4.4を使用しています。以下の私のコードでは、STL をまったく使用していない、かなり厄介な STL エラー メッセージが表示されます。

#include <iostream>


using namespace std;

const int N = 100;

bool s[N + 1];
bool p[N + 1];
bool t[N + 1];

void find(const bool a[], bool b[], bool c[]){
  return;
}


int main(){
  find(s, p, t);
  return 0;
}

g++ stack.cc でコンパイルすると

次のエラー メッセージが表示されます。

/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/stl_algo.h: In function `_RandomAccessIterator std::find(_RandomAccessIterator, _RandomAccessIterator, const _Tp&, std::random_access_iterator_tag) [with _RandomAccessIterator = bool*, _Tp = bool[101]]':
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/stl_algo.h:314:   instantiated from `_InputIterator std::find(_InputIterator, _InputIterator, const _Tp&) [with _InputIterator = bool*, _Tp = bool[101]]'
stack.cc:18:   instantiated from here
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/stl_algo.h:207: error: ISO C++ forbids comparison between pointer and integer
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/stl_algo.h:211: error: ISO C++ forbids comparison between pointer and integer
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/stl_algo.h:215: error: ISO C++ forbids comparison between pointer and integer
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/stl_algo.h:219: error: ISO C++ forbids comparison between pointer and integer
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/stl_algo.h:227: error: ISO C++ forbids comparison between pointer and integer
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/stl_algo.h:231: error: ISO C++ forbids comparison between pointer and integer
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/stl_algo.h:235: error: ISO C++ forbids comparison between pointer and integer

ご覧のとおり、コードは STL をまったく使用していないため、これはかなり奇妙です。また、行を削除するとエラーが消えます

using namespace std;

これは、名前空間の衝突を示唆しています。constfunction の定義からキーワードを削除すると、それも消えますfind

一方、次のように2引数の関数を作成すると、エラー消えます(これはかなり驚くべきことです) 。find

#include <iostream>


using namespace std;

const int N = 100;

bool s[N + 1];
bool p[N + 1];
bool t[N + 1];

void find(const bool a[], bool b[]){
  return;
}


int main(){
  find(s, p);
  return 0;
}

find が2つの引数の関数になり得るが、3つの引数の関数ではない理由が何であるか想像できません。

エラーを削除する 3 つの方法の簡単な要約を以下に示します。

  1. 行を削除しusing namespace std;ます。

  2. constの定義からキーワードを削除しfindます。

  3. 関数の 3 番目の引数を削除しますfind

なぜそのようなエラーが最初に発生するのか、なぜそれを削除する必要があるのか​​ 、論理的な理由は考えられません.上記の一見完全に無関係な手順のいずれかを使用します. これは文書化された g++ バグですか? 探してみたのですが、正直なところ何を探せばいいのか途方に暮れ、いくつか試したキーワード(「STLを使わないSTLエラー」)では何もヒットしませんでした。

4

2 に答える 2

3

std::find. を行ったときに意図せずに(3 つの引数を取る) グローバル名前空間にプルしたため、単純に衝突が発生しますusing namespace std;。何らかの理由で、あなた<iostream>#include-ing <algorithm>、またはその内部実装の一部 (具体的にはbits/stl_algo.h) です。

削除すると消える理由を説明できませんconst。おそらく、コンパイラがオーバーロードを解決する順序に影響します。

于 2012-06-05T20:05:45.000 に答える
0

コンパイラを、標準ライブラリ (std::find) にあるバージョンの find と混同しています。これには 3 つのパラメーターがありますが、あなたが持っているものはありません。

コードが独自の名前空間にある場合は、この問題を回避できます。または、find メソッドの名前を変更するか、既に文書化したソリューションの名前を変更します。

于 2012-06-05T20:05:23.327 に答える