Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Avis sur du code de template

3 réponses
Avatar
DELVA Michael
Bonsoir à tous,

le code suivant compile parfaitement bien:

class foo
{

};

template <class BoxType>
struct SimpleFunctor
{
void operator()(int i) { std::cout << i << std::endl; }
};

template <class BoxType>
struct ComplexFunctor
{
void operator()(int i) { std::cout << "|" << i << "|" << std::endl;
}
};

template <class BoxType>
class Base
{
protected:
std::vector<int> v;
Base() { v.push_back(0); v.push_back(1); }

template <class Functor>
void Print()
{
std::for_each(v.begin(),v.end(),Functor());
}
};

template <class BoxType>
struct Derived : public Base<BoxType>
{
Derived() { v.push_back(2); v.push_back(3); Print<ComplexFunctor
<BoxType> >(); }
};

template <class BoxType>
struct Derived2 : public Base<BoxType>
{
Derived2() { v.push_back(2); v.push_back(3); Print<SimpleFunctor
<BoxType> >(); }
};

int main(int argc, char* argv[])
{
Derived<foo> d;
Derived2<foo> f;

int i;
std::cin >> i;

return 0;
}

Je voudrais modifier la classe Base comme suit:

template <class BoxType>
class Base
{
protected:
std::vector<int> v;
Base() { v.push_back(0); v.push_back(1); }

template <class Functor = SimpleFunctor>
void Print()
{
std::for_each(v.begin(),v.end(),Functor());
}
};

Mais il me met:

[BCC32 Erreur] File1.cpp(36): E2270 > attendu

La ligne 36 étant celle-ci: template <class Functor = SimpleFunctor>.

Quelle est l'erreur?

Merci d'avance

Mike

3 réponses

Avatar
Falk Tannhäuser
DELVA Michael schrieb:
template <class BoxType>
struct Derived : public Base<BoxType>
{
Derived() { v.push_back(2); v.push_back(3); Print<ComplexFunctor
<BoxType> >(); }


Cela ne passe qu'avec des vieux compilos qui n'implémentent pas encore
la recherche de noms en deux temps (2-phase name lookup). Afin que ça
continue de passer avec des compilateurs plus à jour, il faut mettre :

Derived()
{
this->v.push_back(2);
this->v.push_back(3);
this->template Print<ComplexFunctor<BoxType> >();
}

};

template <class BoxType>
struct Derived2 : public Base<BoxType>
{
Derived2() { v.push_back(2); v.push_back(3); Print<SimpleFunctor
<BoxType> >(); }


Pareil.

};

int main(int argc, char* argv[])
{
Derived<foo> d;
Derived2<foo> f;

int i;
std::cin >> i;

return 0;
}

Je voudrais modifier la classe Base comme suit:

template <class BoxType>
class Base
{
protected:
std::vector<int> v;
Base() { v.push_back(0); v.push_back(1); }

template <class Functor = SimpleFunctor>


Je suppose que ça aurait dû être
template <class Functor = SimpleFunctor<BoxType> >
mais cela ne passe pas non plus car on ne peut pas avoir d'arguments par
défaut dans les templates de fonction. Il suffit de surcharger cette
fonction :

template <class Functor>
void Print()
{
std::for_each(v.begin(), v.end(), Functor());
}

void Print()
{
std::for_each(v.begin(), v.end(), SimpleFunctor<BoxType>());
}

La version non-template sera par exemple appelée lorsqu'on met
this->Print();
à la place de
this->template Print<SimpleFunctor<BoxType> >();
dans "Derived2::Derived2()".

Falk

Avatar
Fabien LE LEZ
On 10 Sep 2007 21:24:02 GMT, DELVA Michael :

[BCC32 Erreur] File1.cpp(36): E2270 > attendu


Le message d'erreur de Comeau
<http://www.comeaucomputing.com/tryitout/&gt; est plus instructif :

"default template arguments are not allowed for function templates"

Encore un détail qui m'avait échappé...

Par ailleurs :

template <class Functor = SimpleFunctor> void Print()


"SimpleFunctor" n'est pas une classe, c'est un template.
SimpleFunctor<int>, par contre, est une classe.
SimpleFunctor<BoxType> aussi, si BoxType est une classe.

Avatar
Alexandre Fournier
On 10 Sep 2007 21:24:02 GMT, DELVA Michael :

[BCC32 Erreur] File1.cpp(36): E2270 > attendu


Le message d'erreur de Comeau
<http://www.comeaucomputing.com/tryitout/&gt; est plus instructif :

"default template arguments are not allowed for function templates"



À ce propos, n'y aurait-il pas une erreur de ce type dans le Stroustrup
(§ 13.4.1, dans l'Edition Spéciale ) ?








--
Alexandre Fournier
INRIA - Projet ARIANA
2004 route des Lucioles - BP 93
06902 Sophia-Antipolis Cedex
FRANCE
Tel : 04-92-38-77-73
courriel :