【发布时间】:2013-08-07 20:26:35
【问题描述】:
在我的一门课程中,我尝试使用 std::priority queue 和指定的 lambda 进行比较:
#pragma once
#include <queue>
#include <vector>
auto compare = [] (const int &a, const int &b) { return a > b; };
class foo
{
public:
foo() { };
~foo() { };
int bar();
private:
std::priority_queue< int, std::vector<int>, decltype(compare)> pq;
};
我的程序编译完美,直到我添加一个 .cpp 文件来伴随标题:
#include "foo.h"
int foo::bar()
{
return 0;
}
这一次,我的编译器产生了错误:
>main.obj : error LNK2005: "class <lambda> compare" (?compare@@3V<lambda>@@A) already defined in foo.obj
如果我的头文件包含 lambda,为什么我不能创建随附的 .cpp 文件?
编译器:Visual Studio 2012
我的main.cpp:
#include "foo.h"
int main(){
return 0;
}
【问题讨论】:
-
标记它
const,这样它默认有内部链接。或者更好的是,让它成为一个仿函数。 -
您要声明两个全局变量,均名为
compare,因为foo.h包含在两个单独的源文件中。我同意拉普茨。 -
不要以这种方式使用 lambda。它们旨在创建小的局部函数,而不是通常使用的函数。这比普通函数的可读性差。
-
我只使用 lambda 来初始化
priority_queue,但我是否应该将其切换为仿函数?顺便说一句,谢谢拉普茨 -
我假设你只是举个例子,你的 lambda 更复杂。因为现在它相当于
std::greater<int>