In einer meiner Klassen, ich versuche std::priority queue
mit einem angegebenen Lambda zum Vergleich zu verwenden:Lambda in Header-Datei Fehler
#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;
};
Mein Programm kompiliert perfekt, bis ich eine .cpp
Datei hinzufügen, um den Header zu begleiten:
#include "foo.h"
int foo::bar()
{
return 0;
}
Dieses Mal erzeugt mein Compiler einen Fehler:
>main.obj : error LNK2005: "class <lambda> compare" ([email protected]@3V<lambda>@@A) already defined in foo.obj
Warum kann ich keine begleitende Datei .cpp
erstellen, wenn meine Header-Datei ein Lambda enthält?
Compiler: Visual Studio 2012
Mein main.cpp
:
#include "foo.h"
int main(){
return 0;
}
Mark es 'const', so dass es interne Verknüpfung standardmäßig hat. Oder noch besser, mach es zu einem Funktor. – Rapptz
Sie deklarieren zwei Globals, die beide 'compare' heißen, weil' foo.h' in zwei separaten Quelldateien enthalten ist. Ich stimme Rapptz zu. – WhozCraig
Verwenden Sie keine Lambdas auf diese Weise. Sie sollen kleine lokale Funktionen erzeugen, nicht allgemein benutzte Funktionen. Dies ist weniger lesbar als eine normale Funktion. – GManNickG