Betrachten Sie das folgende:Template alias Sichtbarkeit in verschachtelte Klasse
template<typename X>
struct Z {};
struct A
{
using Z = ::Z<int>;
struct B : Z
{
using C = Z;
};
};
Dies kompiliert in Ordnung. Nett. Aber fügen Sie nun einen anderen Parameter in Z
:
template<typename X, typename Y>
struct Z {};
struct A
{
template<typename X>
using Z = ::Z<X, int>;
struct B : Z<B>
{
using C = Z<B>; // error: too few template arguments for class template 'Z'
};
};
Ok, vielleicht ist es sinnvoll, dass die Definition der Vorlage alias Z
in Klasse A
sichtbar ist, wenn verschachtelte Klasse abgeleitet B
, aber nicht in seinem Körper, die Auslösung der Fehler, da die globale Definition von Z
hat zwei Parameter.
Aber warum das Verhalten unterschiedlich im ersten Fall ist, wenn Z
nur eine Art Alias in A
ist?
Schließlich machen A
eine Vorlage:
template<typename X, typename Y>
struct Z {};
template<typename T>
struct A
{
template<typename X>
using Z = ::Z<X, int>;
struct B : Z<B>
{
using C = Z<B>;
};
};
Jetzt ist der Fehler verschwunden ist. Warum?
(getestet auf Clang 3.6 und GCC 4.9.2)
Wow. Das ist ziemlich klar, danke. Der Fehler tauchte tatsächlich auf, als "A" aufhörte, eine Vorlage zu sein, was, wie ich dachte, den Code sehr vereinfachen würde. Ich bin jedoch gezwungen, zwei verschiedene Namen für die zwei Z zu verwenden, was den Code nur hässlicher macht. Wenn es einen besseren Workaround gibt, lass es mich wissen. – iavr
@iavr Was ist mit 'mit C = Z;'? (Wird nicht funktionieren, wenn 'A' eine Vorlage ist) – Columbo
Nun, das ist beeindruckend :-) Ja, es funktioniert hier an diesem vereinfachten Code, aber nicht an meinem ursprünglichen (' unbekannter Typname 'Z''). Ich muss überprüfen, wo der Unterschied ist. 'A' ist keine Vorlage mehr, und ich beabsichtige, es so zu halten. – iavr