默认容器参数

时间:2012-05-17 17:06:28

标签: c++ stl

当我调用没有参数的函数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

所以权利包括在那里。我的海湾合作委员会版本非常过时(不在家,也不在家里试试) - 但在工作中它是4.1.2

4 个答案:

答案 0 :(得分:4)

代码看起来没问题,但是在gcc 4.3.4上失败了,请参阅here,但是从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() {}
};

否则,您将默认参数耦合到接口,这意味着您无需更改它们而无需重新编译所有客户端代码。

答案 1 :(得分:0)

您发布的代码似乎很好,所以我打开我的Psychic Debugger模块。

你有没有:

#include <vector>

...在你的标题中?

答案 2 :(得分: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()
{
}

答案 3 :(得分: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