创建一个简单的迭代器适配器时,我收到一个编译器错误:“'IteratorAdapter getAdapter(const ContainerT :: iterator&)':无法推断'ContainerT'的模板参数”。这是代码:
#include <list>
template <class ContainerT>
class IteratorAdapter
{
public:
IteratorAdapter(const typename ContainerT::iterator& it) :
it_(it) {}
private:
typename ContainerT::iterator it_;
};
template <class ContainerT>
IteratorAdapter<ContainerT> getAdapter(
const typename ContainerT::iterator& it)
{
return IteratorAdapter<ContainerT>(it);
}
template <class IteratorT>
void someFunc(IteratorT beg, IteratorT end)
{
// ...
}
int main(int argc, char **argv)
{
std::list<int> s;
someFunc(getAdapter(s.begin()), getAdapter(s.end()));
return 0;
}
我认为它可能与const和非const begin()和end()之间的歧义有关。所以我在列表中添加了一个const引用,但不幸的是结果是一样的。为什么编译器会生成此错误?如何解决?
答案 0 :(得分:0)
您不需要IteratorAdapter模板中的容器参数。使用
template <class IteratorT>
class IteratorAdapter
{
public:
IteratorAdapter(const IteratorT& it) :
it_(it) {}
private:
IteratorT it_;
};
template <class IteratorT>
IteratorAdapter<IteratorT> getAdapter(
const IteratorT& it)
{
return IteratorAdapter<IteratorT>(it);
}
答案 1 :(得分:0)
如上所述,无法在getAdapter
中推断出类型。
(它可能有几种正确的类型)。
所以你可以明确地打电话:
someFunc(getAdapter<std::list<int> >(s.begin()), getAdapter<std::list<int> >(s.end()));
或创建带容器的函数(因此可以进行演绎)。
template <class ContainerT>
IteratorAdapter<ContainerT> getAdapterBegin(const ContainerT& container)
{
return IteratorAdapter<ContainerT>(container.begin());
}
template <class ContainerT>
IteratorAdapter<ContainerT> getAdapterEndconst ContainerT& container)
{
return IteratorAdapter<ContainerT>(container.end());
}
可能的黑客攻击:
template <class ContainerT>
IteratorAdapter<ContainerT> getAdapter(const ContainerT&,
const typename ContainerT::iterator& it)
{
return IteratorAdapter<ContainerT>(it);
}
// call it like: getAdapter(s, s.begin())