W jednym z moich zajęć, staram się używać std::priority queue
z określonym lambda dla porównania:Lambda w błąd pliku nagłówka
#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;
};
Mój program kompiluje doskonale aż dodaję plik .cpp
towarzyszyć nagłówek:
#include "foo.h"
int foo::bar()
{
return 0;
}
Tym razem mój kompilator generuje błąd:
>main.obj : error LNK2005: "class <lambda> compare" ([email protected]@3V<lambda>@@A) already defined in foo.obj
Dlaczego nie mogę utworzyć dołączonego pliku .cpp
, jeśli mój plik nagłówkowy zawiera znak lambda?
Kompilator Visual Studio 2012
My main.cpp
:
#include "foo.h"
int main(){
return 0;
}
Oznacz to jako "const", w ten sposób domyślnie ma wewnętrzne powiązanie. Albo jeszcze lepiej, spraw, żeby był funktorem. – Rapptz
Deklarujesz dwa globale o nazwach 'compare', ponieważ' foo.h' jest zawarty w dwóch osobnych plikach źródłowych. Zgadzam się z Rapptz. – WhozCraig
Nie używaj lambdas w ten sposób. Mają one na celu tworzenie małych lokalnych funkcji, a nie ogólnie używanych funkcji. Jest to mniej czytelne niż normalna funkcja. – GManNickG