La difficulté avec types dépendants dans les modèles
J'ai de la difficulté avec les modèles et les types de charge:
namespace Utils
{
void PrintLine(const string& line, int tabLevel = 0);
string getTabs(int tabLevel);
template<class result_t, class Predicate>
set<result_t> findAll_if(typename set<result_t>::iterator begin, set<result_t>::iterator end, Predicate pred) //warning C4346
{
set<result_t> result;
return findAll_if_rec(begin, end, pred, result);
}
}
namespace detail
{
template<class result_t, class Predicate>
set<result_t> findAll_if_rec(set<result_t>::iterator begin, set<result_t>::iterator end, Predicate pred, set<result_t> result)
{
typename set<result_t>::iterator nextResultElem = find_if(begin, end, pred);
if (nextResultElem == end)
{
return result;
}
result.add(*nextResultElem);
return findAll_if_rec(++nextResultElem, end, pred, result);
}
}
Compilateur plaintes, à partir de l'emplacement indiqué ci-dessus:
warning C4346: 'std::set<result_t>::iterator' : dependent name is not a type. prefix with 'typename' to indicate a type
error C2061: syntax error : identifier 'iterator'
Ce que je fais mal?
Dans VS2017, c'est maintenant C7510.
Et si vous utilisez Re-plus nettes problèmes de code, il sera (probablement) de produire cet avertissement:
Et si vous utilisez Re-plus nettes problèmes de code, il sera (probablement) de produire cet avertissement:
Dependent type requires using 'typename' keyword
OriginalL'auteur Nick Heiner | 2010-05-28
Vous devez vous connecter pour publier un commentaire.
Bien, l'avertissement dit:
La dépendants de nom (c'est le
iterator
dansstd::set<result_t>::iterator
) n'est pas un type. Vous avez besoin de le préfixer avectypename
pour indiquer un type:Donc, votre déclaration doit être:
(et la définition doit correspondre à la déclaration)
OriginalL'auteur James McNellis
Vous avez besoin d'un autre mot-clé typename sur cette ligne:
set<result_t> findAll_if(typename set<result_t>::iterator begin,
typenameset<result_t>::iterator end, Predicate pred) //warning C4346
OriginalL'auteur GBegen