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

从这里的其他帖子看来,这可能是编译器问题,在这种情况下,您可以通过typedef直接使用 a 而不是 map 类型来解决它。

#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

您发布的代码看起来不错,所以我将打开我的 Psychic Debugger 模块。

你是否:

#include <vector>

...在您的标题中?

于 2012-05-17T17:12:26.170 回答
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 回答