0

这是我的代码的简化版本,基本上我试图将 STL SET 作为函数参数传递,但我无法这样做。我收到以下错误

错误:无法将 'std::set,std::allocator 转换为 'int' 以将争论 '1' 转换为 void foo(int)

错误:模板论证 1 无效

错误:模板论证 2 无效

错误:模板论证 3 无效

这是产生错误的代码示例

#include <iostream>
#include <set>
using namespace std;

void foo(set<foobar>);

class foobar
{
   public:

   int x;

};

int main()
{

  set<foobar> foobar_set;

  foo(foobar_set);


}

void foo(set<foobar> foobar_set)
{

}

问题:如何将 STL 集作为函数参数传递?

STL Set 存在多长时间,本地范围或全局范围?

4

4 回答 4

11

让我们按顺序考虑事情,编译器(大部分)的方式。当我们查看了这么多代码时:

#include <iostream>
#include <set>
using namespace std;

void foo(set<foobar>);

...什么类型foobar?简短的回答:根据我们到目前为止所看到的,我们没有任何线索——编译器也没有。将 for 的声明foo移到(取决于它的)的定义之后。foobar

class foobar
{
    // ...
};

void foo(set<foobar>); // now the compiler knows what `foobar` means

int main()
{
  set<foobar> foobar_set;

  foo(foobar_set);   // so now this can work
}

现在有一点补充:很有可能你真的不想set<whatever>通过值传递——这将导致复制整个集合。您可能想通过 const 引用传递它:

void foo(set<foobar> const &);

...并确保您对foo匹配项的定义:

void foo(set<foobar> const &) {}

对于“小”类型(例如 , char, ) shortint您通常希望按值传递。对于(可能)与set<whatever>通过 ( const) 引用一样大的东西,通常是首选。它并不总是更好,但通常至少可以接受。在适当的情况下,按值传递可能会更快,但也可能会更慢——有时会慢很多,所以除非您确定自己知道自己在做什么,否则按const引用传递通常是安全的选择。

于 2013-11-14T03:54:27.327 回答
3

我认为问题在这里:

void foo(set<foobar>);

class foobar
{
   public:

   int x;

};

当您进行原型设计时,尚未声明foo该类型,编译器也不知道该怎么做。foobar当我尝试在 ideone编译它时,我收到的第一条错误消息是

prog.cpp:5:14: error: ‘foobar’ was not declared in this scope
               void foo(set<foobar>);

您可以通过重新排序foobar和原型的定义或通过前向声明来解决此问题foobar。完成此操作后,错误应该会清除。set将s 作为参数传递并没有什么特别之处。

希望这可以帮助!

于 2013-11-14T03:51:38.407 回答
3

声明 foo() 时,尚未声明类 foobar。只需在 foo() 之前移动 foobar 的定义即可解决您的问题。希望这可以帮助。

于 2013-11-14T03:53:15.220 回答
0

在声明函数之前尝试前向声明 foobar 类。如果您不想将完整的类移到 foo 函数之上,这也是推荐的方法。

class foobar;
void foo(set<foobar>); // now the compiler knows what `foobar` means

我相信这应该可以解决您的问题,或者至少会给您带来新的错误;)

于 2013-11-14T04:38:00.323 回答