cast og ambiguity
Hej kvikke hoveder, jeg har et spørgsmål jeg håber i kan hjælpe med. Jeg arbejder på et projekt der compiles med både MSVC 8 og gcc 3.0.4, og gcc angiver ambiguity for noget code som MSVC ikke gør.Mit spørgsmål er om det er en fejl i gcc eller om det er en fejl at MSVC ikke rapporterer den.
Burde "static_cast<T>(X)" ikke favorisere "X::operator T()" i stedet for "T( X::operator int() )" ? Det er hvad MSVC 8 gør.
Følgende er koden
{
SubSystemEntityId s( 12345 );
static_cast<ComponentId>(s); // <- Vil ikke compile med gcc
ComponentId(s); // <- Vil ikke compile med gcc
s.operator ComponentId(); // Virker
}
Følgende er definitionen på de to klasser:
class SubSystemEntityId
{
public:
SubSystemEntityId(int id = 0);
SubSystemEntityId operator=(ComponentId componentId);
operator ComponentId() const;
operator int() const;
private:
int m_id;
};
class ComponentId
{
public:
explicit ComponentId(int id = 0) { set(id); }
ComponentId operator=(int id);
ComponentId operator++();
ComponentId operator++(int);
ComponentId operator--();
ComponentId operator--(int);
operator int() const;
private:
int set(int id);
private:
int m_id;
};
Følgende er fejlbeskeden fra gcc:
[cpptasks:cc] /home/xkika/src/iqprobe/VoIPTracker/src/test/common/TestSubSystemEntityId.cpp: In
[cpptasks:cc] member function `void TestSubSystemEntityId::testConstructor()':
[cpptasks:cc] /home/xkika/src/iqprobe/VoIPTracker/src/test/common/TestSubSystemEntityId.cpp:47: call
[cpptasks:cc] of overloaded `ComponentId(SubSystemEntityId&)' is ambiguous
[cpptasks:cc] /home/xkika/src/iqprobe/VoIPTracker/src/common/component/ComponentId.h:25: candidates
[cpptasks:cc] are: ComponentId::ComponentId(const ComponentId&)
[cpptasks:cc] /home/xkika/src/iqprobe/VoIPTracker/src/common/component/ComponentId.h:27:
[cpptasks:cc] ComponentId::ComponentId(int = 0)