Si tratta di un'estensione a questa domanda a partire dal 2011: Range-based for loops and ADLRange-based per Loop e ADL
utilizzando Visual Studio 2015, io non sono in grado di fare una serie basata su ciclo for per un contenitore personalizzato utilizzando Argument Ricerca dipendente (ADL).
ho fatto un semplice caso di test di seguito con un contenitore personalizzato:
#include <vector>
namespace Foo
{
template <typename T>
class Container
{
public:
std::vector<T> values;
};
}
template <typename T>
typename std::vector<T>::iterator begin(Foo::Container<T>& foo)
{
return foo.values.begin();
}
template <typename T>
typename std::vector<T>::iterator end(Foo::Container<T>& foo)
{
return foo.values.end();
}
Utilizzando questo contenitore e ADL, il seguente test compila perfettamente bene:
int main(int argc, char* argv[])
{
Foo::Container<int> values;
for (auto it = begin(values); it != end(values); ++it)
{
...
}
return 0;
}
come dovrebbe. Non sono sicuro che ADL sia utilizzato anche qui, ma a prescindere, ha senso. Da MSDN documentation, abbiamo:
Tenete a mente questi fatti in merito al campo-base per: array
riconosce automaticamente.
Riconosce i contenitori con .begin() e .end().
Utilizza la ricerca dipendente dall'argomento begin() e end() per qualsiasi altra cosa.
Da quello che ho capito di ADL, e la documentazione di cui sopra, il seguente dovrebbe anche compilare:
int main(int argc, char* argv[])
{
Foo::Container<int> values;
for (auto value : values)
{
...
}
return 0;
}
Ma non è così. Invece, ottengo i seguenti errori:
error C3312: no callable 'begin' function found for type 'Foo::Container<int>'
error C3312: no callable 'end' function found for type 'Foo::Container<int>'
Allora, che succede qui? La mia interpretazione di ADL è errata o si tratta di un bug con il compilatore MSVC 14.0?
IINM 'begin()' e 'end()' dovrebbe trovarsi in 'Foo'. – Quentin
Questo non dipende da ADL poiché 'begin' e' end' non si trovano nello spazio dei nomi 'Foo', ma sembra funzionare bene in gcc: http://coliru.stacked-crooked.com/a/12047609140d05a9. Se cambi 'begin' e' end' per prendere invece un 'const' ref, funziona su MSVC? – rici
@rici, no, non è così. Mi chiedo perché funzioni in GCC anche se la risposta di Pavlo è giusta. Quale compilatore è quello giusto ?!:) – Zeenobit