[PyQt] SIP Bug: virtual function wrapped twice due to deep inheritance from base class and ABC

Demetrius Cassidy dcassidy36 at mass.rr.com
Fri Jul 2 01:53:23 BST 2010


Phil,

It's not code specific to that class. It's due to the deep inheritance tree.
You should be able to run my test code and get the same results.

Basically to sum it up:

PTCPSocket  <- PIPDataGramSocket <- PIPSocket <- PSocket (ABC)

PTCPSocket, PIPSocket and PSocket all define a virtual function called
'Listen'.
Commenting 'Listen' out from PSocket, and SIP does not include the function
twice.
Listen is NOT a pure virtual function in the ABC, it has a body.
Listen is fully defined in PTCPSocket, and the other classes except
PIPDataGramSocket.



Phil Thompson-5 wrote:
> 
> On Sat, 19 Jun 2010 10:27:55 -0700 (PDT), Demetrius Cassidy
> <dcassidy36 at mass.rr.com> wrote:
>> Basically I have a Listen() function in a derived class, that is also in
>> the 
>> base and ABC. For some reason sip ends up wrapping the same function
> twice
>> (it 
>> has a body in the ABC), even though it's a virtual function in all of the
> 
>> derived classes. If I comment out this function in the ABC, everything
>> works 
>> fine, but otherwise I get a C2535 compiler error with Visual C++. 
>>  
>> Here is what sip comes up with: 
>>  
>> class sipPUDPSocket : public PUDPSocket 
>> { 
>>  
>>     /* 
>>      * There is a protected method for every virtual method visible from 
>>      * this class. 
>>      */ 
>>  protected: 
>>     PBoolean Listen(unsigned,WORD,PIPSocket::Reusability); 
>>     /*more wrapped functions*/ 
>>     PBoolean Listen(unsigned,WORD,PIPSocket::Reusability); // <--
> duplicate
>> function 
>> }; 
>>  
>> C++ nmake errors: 
>>  
>> sippyptlibPTCPSocket.cpp 
>> .\sippyptlibPTCPSocket.cpp(121) : error C2535: 'PBoolean 
>> sipPTCPSocket::Listen(unsigned int,WORD,PSocket::Reusability)' 
>> : member function already defined or declared 
>>         .\sippyptlibPTCPSocket.cpp(102) : see declaration of 
>> 'sipPTCPSocket::Listen' 
>>  
>>  
>> .\sippyptlibPTCPSocket.cpp(506) : error C2084: function 'PBoolean
>> sipPTCPSocket: 
>> :Listen(unsigned int,WORD,PSocket::Reusability)' already has a body 
>>         .\sippyptlibPTCPSocket.cpp(102) : see previous definition of
>> 'Listen' 
>>  
>>  
>> Basic code structure based on what I am wrapping - note that I only
>> included
>> the 
>> offending function here, as it would be too much code to include
>> everything. 
> 
> But you at least need to include the definition of PUDPSocket.
> 
>> typedef bool PBoolean; 
>>  
>> class PTCPSocket : PIPDataGramSocket 
>> { 
>>  public: 
>>   virtual PBoolean Listen(unsigned int, WORD, PSocket::Reusability); 
>> } 
>>  
>> class PIPDataGramSocket : PIPSocket 
>> { 
>>   protected: 
>>     PIPDataGramSocket(); 
>> } 
>>  
>> class PIPSocket : PSocket 
>> { 
>>  public: 
>>   virtual PBoolean Listen(unsigned int, WORD, PSocket::Reusability); 
>> } 
>>  
>> class PSocket /Abstract/ 
>> { 
>>   public: 
>>     /// Flags to reuse of port numbers in Listen() function. 
>>     enum Reusability { 
>>       CanReuseAddress, 
>>       AddressIsExclusive 
>>     }; 
>>  
>>   virtual PBoolean Listen(unsigned int, WORD, PSocket::Reusability); // 
>> commenting this function out fixes this problem 
>>  
>>  protected: 
>>     /*This function calls os_socket() with the correct parameters for the
> 
>>        socket protocol type. 
>>      */ 
>>     virtual PBoolean OpenSocket() = 0; 
>>  
>> }; 
> 
> Phil
> _______________________________________________
> PyQt mailing list    PyQt at riverbankcomputing.com
> http://www.riverbankcomputing.com/mailman/listinfo/pyqt
> 
> 

-- 
View this message in context: http://old.nabble.com/SIP-Bug%3A-virtual-function-wrapped-twice-due-to-deep-inheritance-from-base-class-and-ABC-tp28936011p29051687.html
Sent from the PyQt mailing list archive at Nabble.com.



More information about the PyQt mailing list