Во-первых, причина вашей двусмысленности: вы предоставляете и преобразование в char*
, и преобразование в std::string const
, и std::string
любит их обоих.
Кстати, прежде чем перейти к вашему вопросу,const
в operator std::string const
когда-то была хорошей идеей, которую защищал, например, Скотт Мейерс, но в настоящее время это плохо: она мешает эффективному перемещению.
В любом случае, вопрос, просто избегайте неявных преобразований.Сделайте эти преобразования явными.Теперь я ответил, что в ответ на другой вопрос SO, и кто-то (я полагаю, что этот человек троллинг) заметил, что C ++ 98 не поддерживает операторы преобразования типа explicit
.Это было достаточно верно, технически, но довольно глупо, как технический комментарий.Потому что вам не нужно использовать ключевое слово explicit
(поддерживается C ++ 11), и это действительно не очень хороший способ сделать преобразования явными.Вместо этого просто name эти преобразования: используйте именованные функции-члены, а не операторы преобразования.
#include <iostream>
template<typename TemplateItem>
class TestA
{
public:
TemplateItem Array[10];
TemplateItem const* data() const { return Array; }
std::string str() const;
};
template<>
std::string TestA<char>::str() const
{
return "";
}
int main()
{
TestA<char> test2;
std::string temp( "Empty" );
temp = test2.str(); // OK.
temp = test2.data(); // Also OK.
}
Cheers & hth.