首页 > 解决方案 > 从 VS2015 升级到 VS2017 后编译错误

问题描述

将我的 VC++ 项目从 VS2015 升级到 VS2017 后,使用 VS2015 构建时没有构建错误。使用 VS2017 我收到以下构建错误:

(217): 错误 C2678: 二进制“*”: 未找到采用“const _Iter”类型的左侧操作数的运算符(或没有可接受的转换)

有问题的行是:

std::vector <WeakRef <int> > vc (weakref_adaptor (v.begin()), weakref_adaptor (v.end()));

WeakRef 和weakref_adaptor 定义如下:

template <class T>
class WeakRef
{
public:
   explicit WeakRef (T* t)
    : _ref (t)
    {}
    WeakRef (const WeakRef& r)
    : _ref (r._ref)
    {}
    WeakRef& operator = (const WeakRef& r)
    {
       _ref = r._ref;
       return *this;
     }

     ~WeakRef ()
     {
        // Quite specifically, nothing to do: certainly not deleting _ref!
     }


    T& operator * () const
    {
        return *_ref;
    }

    T* operator -> () const
    {
        return _ref;
    }

    private:
         T* _ref;
};

template < class Iterator, class Value = typename Iterator::value_type >
class weakref_adaptor_t
{
public:
    typedef typename Iterator base_iterator;

    typedef WeakRef <typename Value> value_type;
    typedef typename base_iterator::difference_type difference_type;
    typedef value_type* pointer;
    typedef value_type& reference;
    typedef std::forward_iterator_tag iterator_category;


    weakref_adaptor_t (const base_iterator& base)
       : _base (base)
    {};


    value_type operator * ()
    {
        return value_type (&(*_base));
    }


   private:
       base_iterator _base;
   };


   template <class Iterator>
   weakref_adaptor_t <Iterator> weakref_adaptor (const Iterator& i)
   {
     return weakref_adaptor_t <Iterator> (i);
    }

   template <class Iterator>
   weakref_adaptor_t <Iterator, const typename Iterator::value_type> 
   const_weakref_adaptor (const Iterator& i)
   {
       return weakref_adaptor_t <Iterator, const Iterator::value_type> (i);
   }
};

标签: c++visual-studio-2017iterator

解决方案


推荐阅读