0

次のヘッダーは、引数なしで関数batを呼び出すと、コメント部分で期待どおりに機能します。

class Test
{
 public:

  void bat(std::vector<int> k = std::vector<int>()) {}
  //void cat(std::map<int, std::vector<int> > k = std::map<int, std::vector<int> >()) {}

};

しかし、ヘッダーでcat関数を使用しようとすると、次のようになります。

class Test
{
 public:

  void bat(std::vector<int> k = std::vector<int>()) {}
  void cat(std::map<int, std::vector<int> > k = std::map<int, std::vector<int> >()) {}

};

私は得る:

test.h:14: error: expected ',' or '...' before '>' token
test.h:14: error: wrong number of template arguments (1, should be 4)
/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_map.h:92: error: provided for 'template<class _Key, class _Tp, class _Compare,\
 class _Alloc> class std::map'
test.h:14: error: default argument missing for parameter 2 of 'void Test::cat(std::map<int, std::vector<int, std::allocator<int> >, std::less<int>, std::all\
ocator<std::pair<const int, std::vector<int, std::allocator<int> > > > >, std::vector<int, std::allocator<int> >)'

どうして?そして、これに対する簡単な回避策はありますか?うまくいけば、インターフェイスでポインタタイプを変更する必要はありませんか?

これは私の完全なヘッダーです:

#ifndef TEST_H
#define TEST_H

#include <map>
#include <vector>
#include <sstream>
#include <iostream>

class Test
{
 public:

  //void bat(std::vector<int> k = std::vector<int>()) {}
  void cat(std::map<int, std::vector<int> > k = std::map<int, std::vector<int> >()) {}

};


#endif

だからすべての権利が含まれています。私のバージョンのGCCはひどく時代遅れです(自宅ではなく、自宅でも試してみてください)-しかし、職場では4.1.2です。

4

4 に答える 4

4

コードは問題ないように見えますが、gcc 4.3.4では失敗します。ここを参照してください。ただし、4.6以降では正常にコンパイルされます(4.4または4.5はテストしていません)。したがって、回避策は新しいgccを使用することのようです。

#include <map>
#include <vector>

class Test
{
 public:

  void bat(std::vector<int> k = std::vector<int>()) {}
  void cat(std::map<int, std::vector<int> > k = std::map<int, std::vector<int> >
()) {}

};

int main() {

}

デフォルトのパラメータに関しては、それらを完全に削除することをお勧めします。

class Test {
 public:

  void bat(std::vector<int> k) {}
  void bat() {}
  void cat(std::map<int, std::vector<int> > k) {}
  void cat() {}
};

それ以外の場合は、デフォルトのパラメーターをインターフェースに結合します。つまり、すべてのクライアントコードの再コンパイルを必要とせずにパラメーターを変更することはできません。

于 2012-05-17T17:16:58.040 に答える
0

あなたが投稿したコードは問題ないようですので、PsychicDebuggerモジュールをオンにします。

しましたか:

#include <vector>

...ヘッダーに?

于 2012-05-17T17:12:26.170 に答える
0

ここにある他の投稿から、コンパイラの問題である可能性があるようです。その場合、typedefマップタイプの代わりに直接使用することで回避できます。

#include <vector>
#include <map>

class Test
{
 public:
  typedef std::map<int, std::vector<int> > MyMap;

  void bat(std::vector<int> k = std::vector<int>()) {}
  void cat(MyMap k = MyMap()) {}

};

int main()
{
}
于 2012-05-17T19:02:12.083 に答える
0

これはC++コアの欠陥レポート325ですhttp://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#325

GCC 4.4は、DRの提案された(ただしまだ公式ではない)解決策を実装しています。http://gcc.gnu.org/bugzilla/show_bug.cgi?id = 57# c36を参照してください。

于 2012-05-18T16:22:53.010 に答える