J'écris un passage LLVM qui renomme des fonctions parmi d'autres choses. J'ai ce petit morceau de codePourquoi cet alias de type provoque-t-il une erreur de compilation (C++)?
// Get function arguments
std::vector<Argument*> Arguments;
for (auto Arg = F.arg_begin(); Arg != F.arg_end(); ++Arg)
{
Type *ArgTy = Arg->getType();
if (ArgTy->isFloatingPointTy())
{
errs() << "Cannot test function: " << F.getName() << " (floating point arguments)\n";
return false;
}
Arguments.push_back(Arg);
}
La ligne Arguments.push_back(Arg)
provoque une erreur de compilation:
no known conversion for argument 1 from ‘llvm::ilist_iterator<llvm::ilist_detail::node_options<llvm::Argument, false, false, void>, false, false>’ to ‘llvm::Argument* const&’
.
Cependant, dans le fichier d'en-tête llvm/IR/Function.h
(source), arg_iterator
est déclarée comme un alias pour le type Argument *
et les fonctions arg_begin()
et arg_end()
appelées par une instance Function
, retourner un type arg_iterator()
. Alors, pourquoi ai-je l'erreur de type? Cela a-t-il quelque chose à voir avec l'utilisation du mot-clé auto
?
Vous * savez * utiliser les itérateurs? Qu'est-ce que vous obtenez quand (par exemple) vous * déréférencer * un itérateur? –
@Someprogrammerdude lorsque l'itérateur est de type 'Argument *', vous obtenez le 'Argument' pointé comme lvalue. Mais la question est de savoir pourquoi le type de 'auto Arg = F.arg_begin()' n'est pas 'arg_iterator' (==' Argument * ') comme déclaré dans l'en-tête mais quelque chose d'autre. UnchartedWaters: Créez un [mcve]. Votre exemple est incomplet. – user2079303