Минимальный набор кода, 100% повторяющий проблему:
class Ambiguity
{
public:
Ambiguity( long& cfg, char* node = NULL ){};
Ambiguity( long& cfg, int mainID, bool bOptional ){};
private:
std::auto_ptr<int> m_voc;
};
class AmbFinger
{
public:
AmbFinger(){};
void fingering( const Ambiguity& reader ){};
};
class AmbGetter
{
public:
AmbGetter(){};
void get(AmbFinger * in )
{
char *node;
long conf;
in->fingering( Ambiguity( conf, node ) );
}
};
Этот код отлично компилируется MSVS всех серий. Неплохо оно работало и на старых GCC. И тут черт дёрнул взять и перейти на GCC 4.0.
Так вот, он ругается. Что не может выбрать функцию.
test1.cpp: In member function 'void AmbGetter::get(AmbFinger*)':
test1.cpp:31: error: no matching function for call to 'Ambiguity::Ambiguity(Ambiguity)'
test1.cpp:7: note: candidates are: Ambiguity::Ambiguity(long int&, char*)
test1.cpp:5: note: Ambiguity::Ambiguity(Ambiguity&)
Судя по всему, он хочет видеть конструктор копирования в классе Ambiguity. Сгенерировать его автоматом он не в состоянии из-за auto_ptr<...> (не говорите мне, что auto_ptr не надо так использовать — я знаю, он там просто как пример обламывающего автогенерацию конструктора копирования выражения).
Хочет он его для temporary объекта для передачи в функцию. Но ведь создавать копию объекта ему не надо — объект передается по ссылке, да еще и константный!
Понятно, что можно удовлетворить всех, сделав конструктор копирования. Но интересно, почему же компиляторы ведут себя по разному и что конкретно не устраивает GCC 4.0 ?
Posted via RSDN NNTP Server 1.9