Wir haben ein seltsames Verhalten bei der Erstellung des follwing Quellcodes beobachtet:C++ 11 Vorlage Alias als Vorlage Vorlage Argument führt zu anderen Typ?
template<template<class> class TT> struct X { };
template<class> struct Y { };
template<class T> using Z = Y<T>;
int main() {
X<Y> y;
X<Z> z;
z = y; // it fails here
}
Dies ist ein leicht modifiziertes Beispiel aus dem c genommen ++ 11 Standardvorschlag für die Template-Aliase: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2258.pdf (Siehe Seite 4) Beachten Sie auch, dass der Vorschlag "deklariert, dass y und z vom selben Typ sind". In unserer Interpretation sollte es daher möglich sein, z aus y zuzuordnen (oder zu kopieren).
Dieser Code wird jedoch weder mit gcc 4.8.1 noch mit clang 3.3 kompiliert. Ist das ein Fehler im Compiler oder haben wir den Standard falsch verstanden?
Dank im Voraus, craffael et al;)
P.S. Die Clang Fehlermeldung lautet:
error: no viable overloaded '='
note: candidate function (the implicit copy assignment operator) not viable: no known conversion from 'X<template Y>' to 'const X<template Z>' for 1st argument
template<template<class> class TT> struct X { };
note: candidate function (the implicit move assignment operator) not viable: no known conversion from 'X<template Y>' to 'X<template Z>' for 1st argument
template<template<class> class TT> struct X { };
'Y' und' Z' sind andere * Template-Namen *, als solche ergeben sie verschiedene Instanziierungen mit 'X'. Siehe § 14.5.7/1. – Xeo