- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
这是我的代码的简化版本,基本上我试图将 STL SET 作为函数参数传递,但我无法这样做。我收到以下错误
error : cannot convert 'std::set,std::allocator to 'int' for arguement '1' to void foo(int)
error: template arguement 1 is invalid
error: template arguement 2 is invalid
error: template arguement 3 is invalid
这是产生错误的代码示例
#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 存在多长时间,局部作用域还是全局作用域??
最佳答案
让我们按照编译器(主要)的方式来考虑事情的顺序。当我们查看了这么多代码时:
#include <iostream>
#include <set>
using namespace std;
void foo(set<foobar>);
...foobar
是什么类型?简短回答:根据我们目前所见,我们没有任何线索——编译器也没有。移动 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
、short
、int
),您通常希望按值传递。对于(可能)与 set<whatever>
一样大的东西通过 ( const
) 引用通常是首选。它并不总是更好,但通常至少是可以接受的。在适当的情况下,按值传递可能会更快,但也可能会更慢 -- 有时会慢 很多,所以除非你确定你知道自己在做什么,否则传递 const
引用通常是安全的选择。
关于c++ - 我如何将 STL 集作为函数参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19969140/
我是一名优秀的程序员,十分优秀!