Tout en faisant variadic template de la programmation en C++11 sur GCC, une fois dans un certain temps, j'obtiens un message d'erreur qui dit "Désolé, non mises en œuvre: ne peut pas développer Identifiant..." dans une longueur fixe arugment liste." Si je supprime les "..." dans le code, puis je reçois un autre message d'erreur: "erreur: paramètre packs pas étendu avec des '...'".
Donc, si j'ai les "..." dans la, CGC appelle qu'une erreur, et si j'enlève les "...", que GCC appelle une erreur de trop.
Le seul moyen que j'ai été en mesure de traiter cette question est de réécrire complètement le modèle metaprogram à partir de zéro en utilisant une approche différente, et (avec de la chance) j'ai fini par venir avec un code qui n'est pas la cause de l'erreur. Mais je voudrais vraiment savoir ce que je faisais mal. En dépit de Googler pour elle et malgré beaucoup d'expérimentation, je ne peux pas cerner ce que c'est que je suis en train de faire différemment entre les variadic template de code qui ne produisent cette erreur, et le code qui n'ont pas l'erreur.
Le libellé du message d'erreur semble indiquer que le code devrait fonctionner selon le standard C++11, mais que GCC ne le supporte pas encore. Ou c'est peut-être un bug du compilateur?
Voici un code qui génère l'erreur. Note: je n'ai pas besoin de vous pour écrire une mise en œuvre correcte pour moi, mais juste pour souligner ce qui est sur mon code qui est à l'origine de cette erreur
// Used as a container for a set of types.
template <typename... Types> struct TypePack
{
// Given a TypePack<T1, T2, T3> and T=T4, returns TypePack<T1, T2, T3, T4>
template <typename T>
struct Add
{
typedef TypePack<Types..., T> type;
};
};
// Takes the set (First, Others...) and, while N > 0, adds (First) to TPack.
// TPack is a TypePack containing between 0 and N-1 types.
template <int N, typename TPack, typename First, typename... Others>
struct TypePackFirstN
{
// sorry, unimplemented: cannot expand ‘Others ...' into a fixed-length argument list
typedef typename TypePackFirstN<N-1, typename TPack::template Add<First>::type, Others...>::type type;
};
// The stop condition for TypePackFirstN: when N is 0, return the TypePack that has been built up.
template <typename TPack, typename... Others>
struct TypePackFirstN<0, TPack, Others...> //sorry, unimplemented: cannot expand ‘Others ...' into a fixed-length argument list
{
typedef TPack type;
};
EDIT: j'ai remarqué que, bien que partielle de l'instanciation d'un modèle qui ressemble à n'encourir l'erreur:
template <typename... T>
struct SomeStruct<1, 2, 3, T...> {};
La réécriture comme cela ne produit pas une erreur:
template <typename... T>
struct SomeStruct<1, 2, 3, TypePack<T...>> {};
Il semble que vous pouvez déclarer les paramètres partiel des spécialisations à variadic; c'est à dire cette ligne est OK:
template <typename... T>
Mais vous ne pouvez pas réellement utiliser ces paramètre packs dans la spécialisation, c'est à dire cette partie n'est pas OK:
SomeStruct<1, 2, 3, T...>
Le fait que vous pouvez le faire fonctionner, si vous l'envelopper le paquet à un autre type, c'est à dire comme ceci:
SomeStruct<1, 2, 3, TypePack<T...>>
pour moi, implique que la déclaration de la variadic paramètre à une partie du modèle de spécialisation a été un succès, et vous ne pouvez pas l'utiliser directement. Quelqu'un peut-il confirmer cela?