で、私は比較のために指定されたラムダとstd::priority queue
を使用しようとしています:私は、ヘッダーに同行する.cpp
ファイルを追加するまでラムダ私のクラスの一つのヘッダファイルエラー
#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;
};
私のプログラムは完全にコンパイルします。
#include "foo.h"
int foo::bar()
{
return 0;
}
この時、私のコンパイラはエラーを生成します。
>main.obj : error LNK2005: "class <lambda> compare" ([email protected]@3V<lambda>@@A) already defined in foo.obj
ヘッダーファイルにラムダが含まれている場合、なぜ添付ファイル.cpp
を作成できないのですか?
コンパイラ:Visual Studioの2012
マイmain.cpp
:
#include "foo.h"
int main(){
return 0;
}
これを 'const'とすると、デフォルトで内部リンケージがあります。それとももっと良いことに、それをファンクターにしてください。 – Rapptz
'foo.h'が2つの別々のソースファイルに含まれているので、' compare 'という名前の2つのグローバルを宣言しています。私はRapptzと同意する。 – WhozCraig
このようにラムダを使用しないでください。それらは、一般的に使用される関数ではなく、小さなローカル関数を作成するためのものです。これは、通常の関数よりも読みにくいです。 – GManNickG