"No matching function call" bei template Funktion und ich weiß nicht warum
-
Hi,
ich habe ein kleines Problem. Und zwar scheint es, als ob er meine Funktion nicht findet.
Definiert ist sie wie folgt:namespace Lincpp { template<typename T> detail::Proxy<typename T::value_type> from(const T& v) { return detail::Proxy<typename T::value_type>(v.begin(), v.end()); } }und ihr Aufruf geschieht hier:
//main.cpp /*14*/std::vector<int> v = {1,2,3,4,5,6,7,8,9}; /*15*/auto result = Lincpp::from(v) .where(IsFive) .select(1);Die Headerdatei der from-Funktion ist korrekt eingebunden, aber ich erhalte folgenden Fehler mit GCC-MinGW-TDragon 4.4.1 -std=c++0x :
main.cpp|15|error: no matching function for call to 'from(std::vector<int, std::allocator<int> >&)'|
Ohne Templateparameter ging es noch. Die Funktion war dann zu Testzwecken so definiert:
detail::Proxy<int> from(const std::vector<int>& v) { return detail::Proxy<int>(v.begin(), v.end()); }Der Aufruf bleibt gleich.
Kann mir jemand vllt. sagen, wo der Fehler leigt und wie ich ihn beseitigen könnte?
Gruß Gate
-
Also mit MSVC kann ich den Fehler nicht reproduzieren - das hier compiliert zumindest:
#include <vector> namespace detail { template <typename T> struct test { template <typename Titerator> test (Titerator begin, Titerator end) {} }; } template<typename T> detail::test<typename T::value_type> from(const T& v) { return detail::test<typename T::value_type> (v.begin(), v.end()); } int main() { std::vector<int> tmp; detail::test<int> x = from(tmp); }Bei dir auch?
Falls ja, musst du den Fehler wohl woanders suchen ^^ Ggf kannst du dasdetail::test<int>vor demxdurch auto ersetzen, falls du glaubst, dass es daran liegen könnte...bb
-
Okay ich hab den Fehler.
Erstmal, deine Variante hat bei mir mit oder ohne auto auch einwandfrei kompiliert.
Nach ein bisschen herumprobieren hab ich festgestellt, dass es am Rückgabetyp liegt, also an der Proxyklasse.
Ganz genau ist der Fehler hier:template<typename T, class ResultContainer = std::vector<typename T::value_type> > class Proxy {Der zweite Parameter erzeugt den Fehler. Diesen ausklammern und es kompiliert. Die Frage von mir wäre jetzt noch, wie muss deklariere ich den optionalen Templateparameter denn richtig?
-
Probier mal
template<typename T, class ResultContainer = std::vector<T> > class Proxy {T ist doch bereits dein value_type du probiert also auf std::vector<int>::value_type::value_type zuzugreifen. Das geht nicht. SFINAE schluckt dir eine bessere Fehlermeldung.
-
Oh man, natürlich haste ja recht. Man, dass ich das nicht gesehen hab. Naja manchmal übersieht man dann doch das offensichtliche

Okay, vielen Dank dir, jetzt läuft alles.Gruß Gate