In una delle mie classi, sto cercando di usare std::priority queue
con un lambda specificato per il confronto:Lambda per errore file di intestazione
#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;
};
mio programma viene compilato perfettamente fino a quando aggiungo un file .cpp
per accompagnare l'intestazione:
#include "foo.h"
int foo::bar()
{
return 0;
}
Questa volta, il mio compilatore genera un errore:
>main.obj : error LNK2005: "class <lambda> compare" ([email protected]@3V<lambda>@@A) already defined in foo.obj
Perché non riesco a creare un file .cpp
di accompagnamento se il mio file di intestazione contiene un lambda?
compilatore Visual Studio 2012
mio main.cpp
:
#include "foo.h"
int main(){
return 0;
}
Contrassegnalo 'const', in questo modo ha il collegamento interno per impostazione predefinita. O meglio ancora, rendilo un funtore. – Rapptz
State dichiarando due globali entrambi chiamati 'compare' perché' foo.h' è incluso in due file sorgente separati. Sono d'accordo con Rapptz. – WhozCraig
Non usare lambda in questo modo. Sono pensati per creare piccole funzioni locali, funzioni non generalmente utilizzate. Questo è meno leggibile di una funzione normale. – GManNickG