2011-11-10 4 views
-1

Je reçois une erreur se produit dans la classe « xutility » - Il est bloqué comme je ne l'a pas crééerreur C2582: la fonction 'opérateur =' est indisponible. (Xutility)

error C2582: 'operator =' function is unavailable in 'Agent' 

Les points d'erreur à ces lignes dans le code:

// TEMPLATE FUNCTION move 
template<class _InIt, 
class _OutIt> inline 
_OutIt _Move(_InIt _First, _InIt _Last, 
    _OutIt _Dest, _Nonscalar_ptr_iterator_tag) 
{ // move [_First, _Last) to [_Dest, ...), arbitrary iterators 
for (; _First != _Last; ++_Dest, ++_First) 
    *_Dest = _STD move(*_First); // this line has the error 
return (_Dest); 
} 

Pourquoi cela se produit-il? Qu'est-ce que cela signifie et comment puis-je le réparer?

EDIT - c'est ce que j'ai attrapé de la sortie, quelqu'un peut-il m'aider à comprendre cela? Désolé d'être un débutant complet ...

1>------ Build started: Project: D3D10DEMO, Configuration: Debug Win32 ------ 
1> Level.cpp 
1>c:\users\asher\documents\my dropbox\direct3d\d3d10demo_1.0\d3d10demo\level.cpp(449): warning  C4018: '<' : signed/unsigned mismatch 
1> Brain.cpp 
1>c:\users\asher\documents\my dropbox\direct3d\d3d10demo_1.0\d3d10demo\brain.cpp(43): warning C4413: 'Brain::nodes' : reference member is initialized to a temporary that doesn't persist after the constructor exits 
1>   c:\users\asher\documents\my dropbox\direct3d\d3d10demo_1.0\d3d10demo\brain.h(34) : see declaration of 'Brain::nodes' 
1>c:\users\asher\documents\my dropbox\direct3d\d3d10demo_1.0\d3d10demo\brain.cpp(43): warning C4413: 'Brain::roomNodeVectors' : reference member is initialized to a temporary that doesn't persist after the constructor exits 
1>   c:\users\asher\documents\my dropbox\direct3d\d3d10demo_1.0\d3d10demo\brain.h(35) : see declaration of 'Brain::roomNodeVectors' 
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\xutility(2514): error C2582: 'operator =' function is unavailable in 'Agent' 
1>   c:\program files (x86)\microsoft visual studio 10.0\vc\include\xutility(2535) : see reference to function template instantiation '_OutIt std::_Move<_InIt,_OutIt> (_InIt,_InIt,_OutIt,std::_Nonscalar_ptr_iterator_tag)' being compiled 
1>   with 
1>   [ 
1>    _OutIt=Agent *, 
1>    _InIt=Agent * 
1>   ] 
1>   c:\program files (x86)\microsoft visual studio 10.0\vc\include\vector(1170) : see reference to function template instantiation '_OutIt std::_Move<Agent*,Agent*>(_InIt,_InIt,_OutIt)' being compiled 
1>   with 
1>   [ 
1>    _OutIt=Agent *, 
1>    _InIt=Agent * 
1>   ] 
1>   c:\program files (x86)\microsoft visual studio 10.0\vc\include\vector(1165) : while compiling class template member function 'std::_Vector_iterator<_Myvec> std::vector<_Ty>::erase(std::_Vector_const_iterator<_Myvec>)' 
1>   with 
1>   [ 
1>    _Myvec=std::_Vector_val<Agent,std::allocator<Agent>>, 
1>    _Ty=Agent 
1>   ] 
1>   c:\users\asher\documents\my dropbox\direct3d\d3d10demo_1.0\d3d10demo\brain.h(41) : see reference to class template instantiation 'std::vector<_Ty>' being compiled 
1>   with 
1>   [ 
1>    _Ty=Agent 
1>   ] 
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\xutility(2514): error C2582: 'operator =' function is unavailable in 'Pickup' 
1>   c:\program files (x86)\microsoft visual studio 10.0\vc\include\xutility(2535) : see reference to function template instantiation '_OutIt std::_Move<_InIt,_OutIt>(_InIt,_InIt,_OutIt,std::_Nonscalar_ptr_iterator_tag)' being compiled 
1>   with 
1>   [ 
1>    _OutIt=Pickup *, 
1>    _InIt=Pickup * 
1>   ] 
1>   c:\program files (x86)\microsoft visual studio 10.0\vc\include\vector(1170) : see reference to function template instantiation '_OutIt std::_Move<Pickup*,Pickup*>(_InIt,_InIt,_OutIt)' being compiled 
1>   with 
1>   [ 
1>    _OutIt=Pickup *, 
1>    _InIt=Pickup * 
1>   ] 
1>   c:\program files (x86)\microsoft visual studio 10.0\vc\include\vector(1165) : while compiling class template member function 'std::_Vector_iterator<_Myvec> std::vector<_Ty>::erase(std::_Vector_const_iterator<_Myvec>)' 
1>   with 
1>   [ 
1>    _Myvec=std::_Vector_val<Pickup,std::allocator<Pickup>>, 
1>    _Ty=Pickup 
1>   ] 
1>   c:\users\asher\documents\my dropbox\direct3d\d3d10demo_1.0\d3d10demo\brain.h(44) : see reference to class template instantiation 'std::vector<_Ty>' being compiled 
1>   with 
1>   [ 
1>    _Ty=Pickup 
1>   ] 
1> Generating Code... 
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== 
+2

Vous devez indiquer * votre * code qui appelle ou qui appelle le code que vous avez fourni. –

+2

la ligne n'a pas ** l'erreur; _detects_ l'erreur et le compilateur _reports_ comme étant détecté sur cette ligne – sehe

+0

Une chose amusante à propos des templates est que les rapports d'erreurs sont un peu foirés dessus. Vous essayez d'utiliser une fonction - 'operator =' - qu'une certaine classe n'a pas, et le compilateur ne peut pas détecter cela avant de regarder l'intérieur de la classe. Concentrez-vous sur votre _usage_ de la classe, en accordant une attention particulière à sa documentation. –

Répondre

1

Vous semblez appeler un modèle de fonction de la bibliothèque standard avec un type Agent qui ne peut pas être affecté à un déplacement, mais l'algorithme appelé doit faire exactement cela. Comme Als a dit dans un commentaire à votre question, vous devez montrer le code qui invoque cet algorithme.

+0

Je ne sais pas quelle partie du code appelle l'algorithme. Que devrais-je rechercher? – SirYakalot

+0

@Sir: À partir du message d'erreur, il semble que vous utilisez VC. Il montre la pile d'instanciation de modèle et à travers cela vous pouvez trouver quelle ligne de votre code a causé l'erreur. – sbi

+0

où est la pile d'instanciation du modèle? Je ne suis pas sûr de savoir où chercher cela. Merci. – SirYakalot

0

Bien sûr, vous devez fournir la classe d'agent.

En supposant C++ 11, vous avez besoin de mettre en œuvre

struct Agent 
{ 
    // .... other stuff 
    Agent(Agent&& other) { /* ... */ } 
    Agent& operator=(Agent&& other) { /* ... */ return *this; } 
}; 

qui est connu comme l'opérateur d'affectation de déplacement. Pendant que vous y êtes, vous voudrez peut-être mettre en œuvre le constructeur de mouvement comme ils vont main dans la main:

Agent(Agent&& other) { /* ... */ } 

Lectures recommandées:

et beaucoup d'autres

+1

"besoin"? Il semble encore suffisant pour implémenter un opérateur d'affectation de copie. – MSalters

+0

@MSalters: nous n'avons ni la classe ni le code appelant. Le modèle de fonction affiché (_Move) n'est pas documenté. Vous pouvez voir clairement qu'il affecte dans un itérateur de sortie de 'std :: move', ce qui implique une sémantique de déplacement. Vous avez peut-être raison de penser qu'un constructeur de copie pourrait suffire à l'utilisateur. – sehe

Questions connexes