У меня есть класс с несколькими конструкторами и перегруженными операторами:
class Utf8String
{
public:
Utf8String();
explicit Utf8String( const char * sStr );
Utf8String( const char * sStrBeg, const char * sStrEnd );
Utf8String( const char * sStr, uint32_t nCpCount );
explicit Utf8String( const Utf8String & sStr );
explicit Utf8String( const Utf8String & sStr, uint32_t nStart = 0, uint32_t nCpCount = UINT32_MAX );
Utf8String( uint32_t nCpCount, uchar32_t cCodePoint );
explicit Utf8String( long int iVal );
explicit Utf8String( double fVal );
// More stuff
inline Utf8String operator + ( const char * sStr ) const
{
Utf8String sRes( *this ); // ERROR
return sRes += sStr;
}
inline operator const char * () const;
inline operator char * ();
inline operator long int () const;
inline operator double () const;
};
По какой-то причине я получаю ошибку:
Error 3 error C2668: 'core::Utf8String::Utf8String' : ambiguous call to overloaded function c:\xxx\utf8string.h 280
Я попытался добавить явные ключевые слова, где это, казалось, имело смысл. Я также добавил явное для всех конструкторов, просто чтобы посмотреть, что происходит, но независимо от того, что я делаю, я получаю эту ошибку и могу выяснить, почему.
У тебя есть идея? Спасибо.
Эти две функции:
explicit Utf8String( const Utf8String & sStr );
explicit Utf8String( const Utf8String & sStr, uint32_t nStart = 0, uint32_t nCpCount = UINT32_MAX );
не должно существовать одновременно. Они вызывают проблему.
Поскольку остальные аргументы второго конструктора дефолт значения, они вызовут неоднозначную ошибку, если вы передадите только один аргумент, как показано ниже:
Utf8String s = get_utfString();
Utf8String s1(s); //which above constructor should be called?
Одним из исправлений будет: удалить значения по умолчанию для второго конструктора.
Кроме того, этот конструктор является копирующим конструктором, и, следовательно, explicit
не имеет особого смысла. Вы бы использовали explicit
избежать неявный версия от одного типа X
к другому типу Y
, В этом случае, избегая неявного преобразования из Utf8String const&
в Utf8String
не имеет смысла, так как такое преобразование не вызовет проблем (если это произойдет, то проблема, вероятно, будет в других частях вашего кода).
Ваши следующие два конструктора могут оба служить конструктором копирования:
explicit Utf8String( const Utf8String & sStr );
explicit Utf8String( const Utf8String & sStr, uint32_t nStart = 0, uint32_t nCpCount = UINT32_MAX );
каждый из них соответствует Utf8String( const Utf8String & sStr )
подпись. Это то, что компилятор не любит.
Вы должны подумать, какой из двух конструкторов вы хотите использовать в качестве конструктора копирования. Если это первый, то сбросьте значение по умолчанию для nStart
во втором конструкторе. Если это второй, то отбросьте первый конструктор целиком.
На самом деле, я предполагаю, что ваш второй конструктор просто берет подстроку и поэтому вызывается без nStart
а также nCpCount
Аргументы будут работать точно так же, как ожидается, что будет работать конструктор копирования. Так что самым простым способом будет просто удалить первый конструктор из этой пары.
Тем не менее, это может привести к некоторым (главным образом к исполнению) проблемам в зависимости от вашего представления о Utf8String
так что решать вам.