我正在寫一個LLVM傳遞函數,以重新命名函數。我有這樣一小段代碼爲什麼這種類型的別名會導致編譯錯誤(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);
}
線Arguments.push_back(Arg)
導致一個編譯錯誤:
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&’
。
然而,在頭文件llvm/IR/Function.h
(source),arg_iterator
被聲明爲類型Argument *
的別名,由Function
實例調用的函數arg_begin()
和arg_end()
,返回arg_iterator()
類型。那麼,爲什麼我會得到類型錯誤?它是否與使用關鍵字auto
有關?
你*知道如何使用迭代器?當你(例如)*解引用*迭代器時得到什麼? –
@Someprogrammerdude當迭代器的類型爲'Argument *'時,你得到指向的'Argument'作爲左值。但問題是爲什麼'auto Arg = F.arg_begin()'的類型不是在頭部聲明的'arg_iterator'(=='Argument *'),而是別的。 UnchartedWaters:創建一個[mcve]。你的例子不完整。 – user2079303