оператор неявного преобразования

Я хочу напечатать все аргументы функции, используя вариационные шаблоны особенность C ++ 11. И я сделал следующее:

struct concatenate
{

template< typename ...ARGS >
explicit
concatenate(ARGS const & ...args)
{
cat(args...);
}

/*explicit*/
operator std::string const () const
{
return oss.str();
}

private :

std::ostringstream oss;

void cat() const
{ ; }

template< typename T, typename ...ARGS >
void cat(T const & head, ARGS const & ...tail)
{
if (oss.tellp() > 0) {
oss << ' ';
}
oss << head;
cat(tail...);
}

};

Затем я пытаюсь проверить это:

std::cout << '\'' << concatenate(1, 2, 3, 4, std::string("ololo"), "alala", 'o', 1.2, 1.2L, 1.2f) << '\'' << std::endl;

но затем данный код не компилируется с ошибкой:

error: cannot bind 'std::basic_ostream<char>' lvalue to 'std::basic_ostream<char>&&'
c:\mingw\lib\gcc\mingw32\4.7.0\include\c++\ostream:600: error: initializing argument 1 of 'std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&&, const _Tp&) [with _CharT = char; _Traits = std::char_traits<char>; _Tp = concatenate]'

Какова природа ошибки? В конце концов, у компилятора нет другого выбора, кроме как использовать оператор преобразования. Это не так?

1

Решение

оператор << для класса шаблон std :: basic_string определяется как (бесплатная) функция шаблон. В отличие от не шаблонных функций, вывод аргументов шаблона не включает в себя возможные преобразования аргументов. Шаблонный оператор << для basic_string нужна именно строка, так как это правильный аргумент, и неявное преобразование (из конкатенации в строку) не работает.

3

Другие решения

Потому что вы не используете явный оператор преобразования, и вы не перегружены operator<< для вашего класса он пытается позвонить:

template <class charT, class traits, class T>
basic_ostream<charT, traits>&
operator<<(basic_ostream<charT, traits>&& os, const T& x);

Использование явного преобразования

std::string(concatenate(1, 2, 3, 4, std::string("ololo"), "alala", 'o', 1.2, 1.2L, 1.2f))

поступает правильно

1

По вопросам рекламы [email protected]