vector move Problem MSVC2013



  • Hi,

    ich versuche gerade mein altes Projekt auf MSVC2013 zu portieren. Leider kompiliert er Folgendes nicht mehr:

    struct type {};
    
    	typedef std::vector<type> vType;
    
    	class cl
    	{
    	private:
    		vType a;
    
    	public:
    		void setInfo(vType b)
    		{
    			this->a = std::move(b);
    		}
    	};
    

    Ohne Move kein Problem, doch mit: Eine Kette von "siehe"-Hinweisen und letztendlich sagt er:

    1>c:\program files (x86)\microsoft visual studio 12.0\vc\include\xutility(750): error C2677: Binärer Operator '+=': Es konnte kein globaler Operator gefunden werden, der den Typ 'std::_Vector_iterator<std::_Vector_val<std::_Simple_typesRange::type>>' akzeptiert (oder keine geeignete Konvertierung möglich)
    1> c:\program files (x86)\microsoft visual studio 12.0\vc\include\xutility(758): Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template "void std::_Distance2<_InIt,__w64 int>(_RanIt,_RanIt,_Diff &,std::random_access_iterator_tag)".

    hier:

    template<class _RanIt,
    	class _Diff> inline
    		void _Distance2(_RanIt _First, _RanIt _Last, _Diff& _Off,
    			random_access_iterator_tag)
    	{	// add to _Off distance between random-access iterators
     #if _ITERATOR_DEBUG_LEVEL == 2
    	if (_First != _Last)
    		{	// check for null pointers
    		_DEBUG_POINTER(_First);
    		_DEBUG_POINTER(_Last);
    		}
     #endif /* _ITERATOR_DEBUG_LEVEL == 2 */
    
    	_Off += _Last - _First; // <----------------
    	}
    

    Ich kann damit nichts anfangen und dachte mir, vll erstellt er für type nicht automatisch move-ctor/move-assignment-op. Jedoch ändert die Änderung zu:

    struct type
    	{
    		type(type&&) {}
    		type& operator=(type&&) {}
    	};
    

    nichts.

    Mein Projekt lief in MSVC2010. Ist MSVC2013 jetzt standardkonformer und mein Code nicht?

    Freue mich über alle Antworten, vielen Dank und beste Grüße!



  • Also

    #include <vector>
    
    struct type {};
    
    typedef std::vector<type> vType;
    
    class cl
    {
    private:
    	vType a;
    
    public:
    	void setInfo(vType b)
    	{
    		this->a = std::move(b);
    	}
    };
    
    int main()
    {
    	cl c;
    	vType v;
    	c.setInfo(v);
    }
    

    Kompiliert bei mir ganz normal, wo bekommst du da denn genau einen Fehler?


Anmelden zum Antworten