hier ein minimales Beispiel, das ich tun konnte:Sichtbarkeit Probleme bei der Verwendung von CRTP
template <typename T>
struct Util
{
using Type = int;
};
struct A
{
struct B : public Util<B> {
void fun(Type) {}
};
};
template <typename T>
struct C
{
struct D : public Util<D> {
void fun(Type) {}
};
};
int main()
{
A::B{}.fun(0);
C<int>::D{}.fun(0);
}
Der einzige Unterschied zwischen A::B
und C::D
ist, dass C
eine Vorlage.
Struct C::D
schlägt mit dem folgenden Fehler zu kompilieren:
test_cpp.cpp:18:18: error: ‘Type’ has not been declared
void fun(Type) {}
^~~~
Warum tut dies nicht zu kompilieren? Wie mache ich das kompilieren?
Nehmen Sie an, dass Util aus externen Bibliothek ist und ich kann es nicht ändern (es ist boost::iterator_facade
, wenn Sie neugierig sind).
Danke! Ich würde hinzufügen, dass in "A :: B" der "Typ" ist ein "nicht abhängiger Name" und in "C :: D" ist es ein "abhängiger Name" (es hängt von Vorlage Argument). https://isocpp.org/wiki/faq/templates#nondependent-name-lookup-types – etam1024