Hi,
ich bastel gerade an einer kleinen C++ Library. Manchmal kompilier ich den Code mit g++/Linux oder im Borland Dev Studio 2006/Windows.
Allerdings will der bcc32 neuerdings den Code nicht kopmilieren. Testweise hab ich mal den Intel Compiler (icpc/icc) und den C++ Compiler von Microsoft VS2008 ausprobiert. Die bekommen das alle gebacken.
Es geht um ein class template, dass ein template-template Argument und 2 weitere class Arguemente hat.
Ich möchte dieses Template spezialisieren, meist auf das template-template Argument.
Aber genau hier ist das Problem: Wenn ich das template nur teilweise spezialisiere (siehe definitions.hpp), dann sagt der Compiler:
Delphi-Quellcode:
[C++ Error] main.cpp(27): E2064 Cannot initialize 'sqlite::iterator<SQL92Traits,struct> &' with 'sqlite::iterator<SQL92Traits,MyStruct<EngineT,SqlTraitsT> >'
[C++ Error] main.cpp(27): E2342 Type mismatch in parameter 'ref' (wanted 'sqlite::iterator<SQL92Traits,struct> &', got 'sqlite::iterator<SQL92Traits,MyStruct<EngineT,SqlTraitsT> >')
Spezialisiere ich das Template komplett oder lasse die Spezialisierung ganz weg, kompiliert der Code wieder.
Offensichtlich kann er die Typen der beiden Parameter von operator()() nicht korrekt auflösen, weshalb in der Fehlermeldung auch steht "..,struct>" passt nicht zu "..,MyStruct<EngineT, SqlTraitsT>".
Die Frage ist aber, warum kann er es auflösen wenn das Template komplett spezialisert wird?
Ich habe den Code aufs Minimum reduziert und als Anhang beigefügt. Vielleicht kann mir irgend jemand erklären warum der bcc32 so reagiert und alle anderen richtig