Ich habe folgendes MWE:Gibt es eine Möglichkeit, einen verschachtelten Vorlagentyp implizit in C++ zu finden?
#include <iostream>
#include <memory>
class A {
public:
int n = 42;
typedef std::shared_ptr<A> Ptr;
};
template<typename T>
void foo(typename T::Ptr arg) {
std::cout << arg->n << std::endl;
}
template<typename T>
void bar(T arg) {
std::cout << arg.n << std::endl;
}
int main() {
A::Ptr a = A::Ptr(new A());
foo<A>(a); // Can I avoid giving <A> here explicitly.
// foo(a); // does not compile
bar(*a); // after all this does work
return 0;
}
Für mich sieht es aus wie es auch möglich sein sollte foo(a)
statt foo<A>(a)
zu nennen. Warum ist das nicht möglich und kann ich die Definition von foo
irgendwie ändern, um dies zu ermöglichen?
Ich realisiere, dass ich einfach die ::Ptr
in der Signatur überspringen konnte, aber ich möchte immer noch Zugriff auf die A
Art ohne den Zeiger haben.
was ein „nicht ist -dezierbarer Kontext "? wie funktioniert es? Wo gilt es? – Ven
Das macht es klar. Vielen Dank. –
@Ven Kurz gesagt, gilt es immer dann, wenn der Compiler keinen vernünftigen Weg hat, den Parameter abzuleiten, der bei Vorhandensein von Eckfällen und einer unbegrenzten Menge von Typen und Werten normal bleibt. Für eine formalere Behandlung verweisen wir auf Kapitel 14 des C++ - Standards. – Angew