【问题标题】:Error with template operator overloading模板运算符重载错误
【发布时间】:2012-07-30 15:11:46
【问题描述】:

我写了一个类,我想为它实现一个迭代器(如下代码所示)。我需要重载各种运算符,我遇到了下面提到的错误:

class BaseClass
{
    virtual ~BaseClass() {}
};

template<class T>
class AbstractBaseOrgan: public BaseClass
{
public:
    typedef T value;
    template<class TT>
    class AbstractBaseIterator:
        public std::iterator<std::random_access_iterator_tag,
        typename std::iterator_traits<TT>::value_type>
    {
    protected:
        TT _M_current;
        const TT&
        base() const
        { return this->_M_current; }
    };
protected:
    value te;
};


template<typename Iter>
inline bool
operator<(const typename AbstractBaseOrgan<typename 
    std::iterator_traits<Iter>::value_type>::template 
    AbstractBaseIterator<Iter>& lhs,
    const typename AbstractBaseOrgan<typename 
    std::iterator_traits<Iter>::value_type>::template 
    AbstractBaseIterator<Iter>& rhs)
{ return lhs.base() < rhs.base(); }

int main()
{
    AbstractBaseOrgan<int>::AbstractBaseIterator<int*> temp;
    AbstractBaseOrgan<int>::AbstractBaseIterator<int*> temp2;
    int ttemp;
    if(operator< (temp,temp2))
        ttemp = 0;
    return 0;
} 

编译它给我以下错误:

error: no matching function for call to ‘operator<(AbstractBaseOrgan<int>::AbstractBaseIterator<int*>&, AbstractBaseOrgan<int>::AbstractBaseIterator<int*>&)’

知道是什么原因造成的吗?

【问题讨论】:

  • 这可能与你的问题无关,但你不应该使用reserved names_Iterator__lhs
  • 编译器无法推断类型。 if(operator (temp,temp2)) 可以正常编译。
  • 是的,没错,但我不想使用这段代码。我想使用:temp

标签: c++ templates operator-overloading


【解决方案1】:

4 在大多数情况下,类型、模板和非类型值 用于组合 P 参与模板参数推导。那是, 它们可用于确定模板参数的值,以及 如此确定的值必须与确定的值一致 别处。然而,在某些情况下,该值不 参与类型推导,而是使用模板的值 在别处推导出来或明确指定的论点。 如果模板参数仅在非推导上下文中使用并且是 未明确指定,模板参数推导失败。

未推断的上下文是: — 使用限定 ID 指定的类型的嵌套名称说明符。

您可以通过几种方式避免这种情况。第一种方法 - 使运算符

template<class TT>
class AbstractBaseIterator:
    public std::iterator<std::random_access_iterator_tag,
    typename std::iterator_traits<TT>::value_type>
{
    public:
        template<typename Iter>
        friend bool operator < (const AbstractBaseIterator<Iter>& lhs, const AbstractBaseIterator<Iter>& rhs)
        {
            return lhs.base() < rhs.base();
        }
protected:
    TT _M_current;
    const TT&
    base() const
    { return this->_M_current; }
};

第二个变体是定义 AbstractBaseIterator 类不在模板类中。然后是 AbstractBaseOrgan 中的 typedef AbstractBaseIterator&lt;T&gt; iterator;。如果你可以使用 C++11,你可以使用类似的东西。

class BaseClass
{
    virtual ~BaseClass() {}
};

template<class TT>
class AbstractBaseIterator:
public std::iterator<std::random_access_iterator_tag,
typename std::iterator_traits<TT>::value_type>
{
protected:
    TT _M_current;
    const TT&
    base() const
    { return this->_M_current; }
};

template<typename Iter>
bool operator < (const AbstractBaseIterator<Iter>& lhs, const AbstractBaseIterator<Iter>& rhs)
{
   return lhs.base() < rhs.base();
}

template<class T>
class AbstractBaseOrgan: public BaseClass
{
public:
    typedef T value;
    template<typename TT>
    using iterator = AbstractBaseIterator<TT>;
protected:
    value te;
};

int main()
{
    AbstractBaseOrgan<int>::iterator<int*> temp;
    AbstractBaseOrgan<int>::iterator<int*> temp2;
    int ttemp;
    if(operator< (temp,temp2))
        ttemp = 0;
    return 0;
}

【讨论】:

  • 可能遇到的更丑陋的场景之一。
  • @user1539100 我重写了我的答案。首先评论另一个答案。
  • @ForEveR 感谢您的回答。有了你的解决方案,我的问题已经解决了,但我发现了新问题。 :94: 错误: 'template bool operator::AbstractBaseIterator&, const AbstractBaseOrgan::AbstractBaseIterator&)' 的重新定义:94: error: 'template bool operator::AbstractBaseIterator&, const AbstractBaseOrgan::AbstractBaseIterator&)' 之前在这里定义
  • @user1539100 您尝试使用哪种解决方案?请给代码。 liveworkspace.org写在这里,请点击运行并给出链接。
  • @ForEveR:感谢您的回复,链接是:liveworkspace.org/code/5d166208abe3869f61087bbaecad2250
猜你喜欢
  • 2013-09-06
  • 1970-01-01
  • 1970-01-01
  • 2015-09-15
  • 1970-01-01
  • 1970-01-01
  • 2022-10-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多