关联容器的迭代器不依赖于比较器模板参数

Iterator of associative container is not dependent on Comparator template argument

编译器无法区分两种不同类型的迭代器。

在此处查看两种类型。

typedef std::set<int, std::greater<int> >             PriceBookBuy;
typedef std::set<int, std::less<int> >                PriceBookSell;

typedef PriceBookBuy::iterator PriceBookBuyIter;
typedef PriceBookSell::iterator PriceBookSellIter;

我想重载一个基于两种迭代器类型的模板方法。

class LVOrderBookBin
{
    int a;
    int b;
    public:

   template<typename PriceBookBuy>
   void erasePriceLevel(std::vector<PriceBookBuyIter> remover) throw()
   {
            b++;
            remover.begin();
        }
        template<typename PriceBookSell>
        void erasePriceLevel(std::vector<PriceBookSellIter> remover) throw()
        {
            a++;
            remover.begin();
        }
};

典型用法:

int main()
{
    std::vector< PriceBookBuyIter> vecBuy(3);
    std::vector< PriceBookSellIter> vecSell(3);


    LVOrderBookBin lv;
    lv.erasePriceLevel<PriceBookBuy>(vecBuy);
    lv.erasePriceLevel<PriceBookSell>(vecBuy);
}

用于 Vs2008 的相同代码,但不能用 VS2013 编译。它也不能用 gcc 编译。

错误:‘template void LVOrderBookBin::erasePriceLevel(std::vector, std::allocator > >)’无法重载

有解决办法吗?

标准库实现完全有权这样做,而且几乎成为强制性的。您看到的效果被称为 SCARY 迭代器,这是一件好事。

您必须将迭代器包装在自定义结构中 - 使用您自己的自定义类型有效地标记它们才能以这种方式使用 OR。

这不是专门化模板的正确方法;您只是在声明函数重载。你需要像这样专攻:

class LVOrderBookBin
{
public: 
    template<typename T>
    void erasePriceLevel(std::vector<typename T::iterator> remover) throw();
};

template<>
void LVOrderBookBin::erasePriceLevel<PriceBookBuy>
     (std::vector<PriceBookBuyIter> remover) throw()
{
    //...
}
template<>
void LVOrderBookBin::erasePriceLevel<PriceBookSell>
     (std::vector<PriceBookSellIter> remover) throw()
{
    //...
}