Questo funziona:Come fornire la definizione di un operatore amico in una classe annidata di una classe template?
template<class Tim>
struct Bob
{
struct Dave
{
Tim t{};
friend bool operator < (const Dave& a, const Dave& b)
{
return a.t < b.t;
}
} d;
};
Questo non funziona:
template<class Tim>
struct Bob
{
struct Dave
{
Tim t{};
friend bool operator < (const Dave& a, const Dave& b);
} d;
};
template<class Tim>
bool operator < (const typename Bob<Tim>::Dave& a, const typename Bob<Tim>::Dave& b)
{
return a.t < b.t;
}
Quando provo ad usarlo in una mappa, ad esempio, ricevo errori del linker:
1>ConsoleApplication1.obj : error LNK2019: unresolved external symbol "bool __cdecl operator<(struct Bob<int>::Dave const &,struct Bob<int>::Dave const &)" ([email protected][email protected][email protected]@@[email protected]) referenced in function "public: bool __thiscall std::less<struct Bob<int>::Dave>::operator()(struct Bob<int>::Dave const &,struct Bob<int>::Dave const &)const " ([email protected]@[email protected]@@@[email protected]@[email protected][email protected]@@[email protected])
.
int main()
{
std::map<Bob<int>::Dave, int> v;
v[{}];
}
Come posso definire questo operatore correttamente di fuori la classe?
Se si attivano avvisi, si ottiene: 'avviso: dichiarazione amico 'bool operatore <(const Bob :: Dave &, const Bob :: Dave &)' dichiara una funzione non modello '(e un suggerimento su cosa fare su di esso) - così l'amico 'operatore <' dichiari, e il 'template <...> operator <' che definisci più in basso non sono la stessa cosa. –
melak47
@ melak47 VS2015 livello di avviso 4, non ricevo alcun avviso. –
Siamo spiacenti, guarda l'output di gcc: http://coliru.stacked-crooked.com/a/bb58214d285f031f – melak47