简单的迭代器适配器模板匹配失败

时间:2014-01-13 12:47:47

标签: c++ templates arguments matching

创建一个简单的迭代器适配器时,我收到一个编译器错误:“'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引用,但不幸的是结果是一样的。为什么编译器会生成此错误?如何解决?

2 个答案:

答案 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())