Dies ist eine Erweiterung auf diese Frage ab 2011: Range-based for loops and ADLBereich Basierte For-Schleife und ADL
mit Visual Studio 2015, ich bin nicht in der Lage eine bereichsbasierte for-Schleife für einen benutzerdefinierten Container mit Argument zu machen Abhängige Suche (ADL).
ich einen sehr einfachen Testfall unten mit einem benutzerdefinierten Container gemacht habe:
#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();
}
Mit diesem Behälter und ADL, der folgende Test kompiliert völlig in Ordnung:
int main(int argc, char* argv[])
{
Foo::Container<int> values;
for (auto it = begin(values); it != end(values); ++it)
{
...
}
return 0;
}
wie es sollte. Ich bin mir nicht sicher, ob ADL hier überhaupt verwendet wird, aber egal, es macht Sinn. Von MSDN documentation haben wir:
Denken Sie daran, diese Fakten über bereichsbasierte für:
automatisch erkennt Arrays.
Erkennt Container, die .begin() und .end() haben.
Verwendet die Argument-abhängige Suche begin() und end() für alles andere.
Von dem, was ich von ADL verstehen, und die Dokumentation oben, sollte die folgende auch kompilieren:
int main(int argc, char* argv[])
{
Foo::Container<int> values;
for (auto value : values)
{
...
}
return 0;
}
Aber es funktioniert nicht. Stattdessen erhalte ich folgende Fehler:
error C3312: no callable 'begin' function found for type 'Foo::Container<int>'
error C3312: no callable 'end' function found for type 'Foo::Container<int>'
Also, was ist hier los? Ist meine Interpretation von ADL falsch oder ist das ein Fehler mit MSVC 14.0 Compiler?
IINM 'begin()' und 'end()' sollten in 'Foo' stehen. – Quentin
Dies hängt nicht von ADL ab, da 'begin' und' end' nicht im Namespace 'Foo' sind, aber es scheint in gcc gut zu funktionieren: http://coliru.stacked-crooked.com/a/12047609140d05a9. Wenn Sie 'begin' und' end' ändern, um stattdessen einen 'const'ref zu verwenden, funktioniert das dann auf MSVC? – rici
@rici, Nein, tut es nicht. Ich frage mich, warum es in GCC funktioniert, wenn Pawlos Antwort richtig ist. Welcher Compiler ist der richtige ?!:) – Zeenobit