Visual C++ máshogy fordít a CUDA telepítése után
2020-03-16T10:28:58+01:00
2020-03-16T17:34:45+01:00
2022-07-19T00:35:39+02:00
Mate12345
Sziasztok,

Van egy szép, kb 15 éves legacy Visual C++ projectem, ami az évek alatt 100.000 sor körülire hízott furcsa hivatkozásokkal. (Gondolom, nem kell senkinek sem bemutatni a helyzetet. :D )

Apróbb hibajavításokat végeztem rajta egészen addig, amíg pár hete nem telepítettem fel a Windows 10-es gépemre a CUDA-t. (A TensorFlow miatt.) A CUDA telepítés közben hisztizett, hogy neki nem jó a C++ fordító, de végül feltelepítettem valami Visual C++-os addont (mintha eddig nem lett volna a gépemen) és utána egyből működött, de sajnos már nem emlékszem, mit telepítettem.

Azt sajnos csak mút hét végén vettem észre, hogy nem tudom lefordítani a korábban említett legacy-s projectet és ötletem nincs, hogy mi lehet a baj.
A project paramétereit nem módosítottam. Gittel megnéztem a korábbi verziókat, ugyanezeket a hibákat kapom. Láttatok már esetleg ilyent? Mi okozhatja? Valamilyen hibás fordítóparaméter?

Sajnos a CUDA telepítése elég nyögvenyelősen ment, de végül az alábbiakat telepítettem:

* cuda_10.1.105_win10_network.exe
* cudnn-10.1-windows10-x64-v7.6.5.32.zip





A kód nagyon hosszú, de próbálom a hiba lényegét (a hibaüzenetek alapján) felrakni.

A lényeg, hogy van egy TransportOrder object, aminek az elemei (érték szerint) egy listába (std::list) kerülnek.

A TransportOrder-nek van 3 konstruktora, amik közül az egyik egyparaméteres:

TransportOrder(uint16_t _orderNumber) {...}

Van ezen kívül egy összehasonlító operátor értelmezve rá:

bool operator==(const TransportOrder& o) { return (orderNumber == o.orderNumber) || sameId(o); }

A listát (és az iterátorát) az alábbi módon vezetem be:

class SzuperTitkosOsztályNév { public: typedef std::list<TransportOrder>::iterator OrderIterator; private: std::list<TransportOrder> orders; ... }


Amikor ezt megpróbálom fordítani, rengeteg error-t kapok (a SzuperTitkosOsztályNév egy header állományban van), mindegyik az alábbi:

1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.24.28314\include\list(1583,1): error C2678: binary '==': no operator found which takes a left-hand operand of type 'const _Ty' (or there is no acceptable conversion) 1> with 1> [ 1> _Ty=TransportOrder 1> ] 1>D:\...\...\titkosHeader.h(942,7): message : could be 'bool TransportOrder::operator ==(const TransportOrder &)' 1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\shared\guiddef.h(192,15): message : or 'bool operator ==(const GUID &,const GUID &)' [found using argument-dependent lookup] 1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.24.28314\include\list(1583,1): message : while trying to match the argument list '(const _Ty, const _Ty)' 1> with 1> [ 1> _Ty=TransportOrder 1> ] 1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.24.28314\include\list(1582): message : while compiling class template member function 'auto std::list<TransportOrder,std::allocator<TransportOrder>>::remove(const _Ty &)' 1> with 1> [ 1> _Ty=TransportOrder 1> ] 1>D:\...\...\titkosHeader.h(1420): message : see reference to class template instantiation 'std::list<TransportOrder,std::allocator<TransportOrder>>' being compiled

Az egyes hibákra kattintva az alábbi sorokra vág be:

Error C2678 binary '==': no operator found which takes a left-hand operand of type 'const _Ty' (or there is no acceptable conversion) AgvSrv C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.24.28314\include\list 1583

Erre a list fájl 1583. sorára dob, ami az alábbi:

1582: auto remove(const _Ty& _Val) { // erase each element matching _Val 1583: return remove_if([&](const _Ty& _Other) { return _Other == _Val; }); 1584: }

-

Message could be 'bool TransportOrder::operator ==(const TransportOrder &)' AgvSrv D:\...\...\titkosHeader.h 942

Erre az alábbi sorra dob be:

bool operator==(const TransportOrder& o) { return (orderNumber == o.orderNumber) || sameId(o); }

-

Message or 'bool operator ==(const GUID &,const GUID &)' [found using argument-dependent lookup] AgvSrv C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\shared\guiddef.h 192

Ez az alábbi sorra dob be:

191: #ifdef __cplusplus 192: __inline bool operator==(REFGUID guidOne, REFGUID guidOther) 193: { 194: return !!IsEqualGUID(guidOne,guidOther); 195: }

-

Message while trying to match the argument list '(const _Ty, const _Ty)' AgvSrv C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.24.28314\include\list 1583

Ez az alábbi sorra dob be:

1582: auto remove(const _Ty& _Val) { // erase each element matching _Val 1583: return remove_if([&](const _Ty& _Other) { return _Other == _Val; }); 1584: }

-

Message while compiling class template member function 'auto std::list<TransportOrder,std::allocator<TransportOrder>>::remove(const _Ty &)' AgvSrv C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.24.28314\include\list 1582

Ez az alábbi sorra dob be:

1582: auto remove(const _Ty& _Val) { // erase each element matching _Val 1583: return remove_if([&](const _Ty& _Other) { return _Other == _Val; }); 1584: }

-

Message see reference to class template instantiation 'std::list<TransportOrder,std::allocator<TransportOrder>>' being compiled AgvSrv D:\Munka\Richter\EkAgvService\inc\ekagvcom\ekagv.h 1420

Ez az alábbi sorra dob be:

1418: class SzuperTitkosOsztályNév { 1419: public: 1420: typedef std::list<TransportOrder>::iterator OrderIterator; 1421: private: 1422: std::list<TransportOrder> orders;

_____________________________

Ezután még kapok egy másik furcsa hibát, de szerintem az is ezzel van összefüggésben:

Error C2451 conditional expression of type 'void' is illegal AgvSrv C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.24.28314\include\list 1594

-

Message Expressions of type void cannot be converted to other types AgvSrv C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.24.28314\include\list 1594


Ezek az alábbi sorra dob be:

1586: template <class _Pr1> 1587: auto remove_if(_Pr1 _Pred) { // erase each element satisfying _Pred 1588: auto& _My_data = _Mypair._Myval2; 1589: _List_node_remove_op _Op(*this); 1590: const auto _Last = _My_data._Myhead; 1591: const size_type _Oldsize = _My_data._Mysize; 1592: for (auto _First = _Last->_Next; _First != _Last;) { 1593: auto _Next = _First->_Next; 1594: if (_Pred(_First->_Myval)) { 1595: _Op._Transfer_back(_First); 1596: } 1597: 1598: _First = _Next; 1599: }

-

Message see reference to function template instantiation 'auto std::list<TransportOrder,std::allocator<TransportOrder>>::remove_if<std::list<TransportOrder,std::allocator<TransportOrder>>::remove::<lambda_b453330cb67a2e2394c42a58e7f340a3>>(_Pr1)' being compiled AgvSrv C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.24.28314\include\list 1583

Ez az alábbi sorra dob be:

1582: auto remove(const _Ty& _Val) { // erase each element matching _Val 1583: return remove_if([&](const _Ty& _Other) { return _Other == _Val; }); 1584: }
Mutasd a teljes hozzászólást!
Nem olvastam végig, de az első dolog ami feltűnt:

Az operator==-nek const-nak kéne lennie. A hibaüzenet alapján azt keresné és valóban nincs olyan..

binary '==': no operator found which takes a left-hand operand of type 'const _Ty' _Ty=TransportOrder
Ez lehet, hogy meg is oldja a dolgot..

Célszerűbb az ilyen operatorokat nem member-ként implementálni, de így is mennie kéne.
Mutasd a teljes hozzászólást!

abcd