#c #casting
Вопрос:
Почему приведение типа ostringstream к типу ostream работает, но наоборот не работает ?
int main() { //part #1 ostringstream oss; ostreamamp; os=oss ; // ^^ It works //part #2 ostream os2 ; ostringstreamamp; oss2=os2; cout lt;lt;"address is "lt;lt;amp;oss; // ^^ It doesn't work return 0; }
Часть № 2 кода выдает ошибку
«ошибка: ‘std::basic_ostreamlt;_CharT, _Traitsgt;::basic_ostream() [с _CharT = char; _Traits = std::char_traits]» защищен в этом контексте».
Как я могу исправить эту проблему ?
Редактировать :- Взгляните на этот код , я хочу получить доступ к ответу в функции curlCall без внесения каких-либо изменений в параметры какой-либо функции
size_t CurlDataWrite(void* buf,size_t size,size_t nmemb,void* userp) { //code to write stream ostreamamp; os=*static_castlt;ostream*gt;(userp); streamsize len=size*nmemb ; if(os.write(static_castlt;char*gt; (buf),len)) return len ; return 0 ; } void curlCall(ostreamamp; os) { CURL* curl=curl_easy_init(); curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,amp;CurlDataWrite) ; curl_easy_setopt(curl,CURL_FILE,amp;os); curl_easy_setopt(curl,CURLOPT_URL, "https://something.com"); int code=curl_easy_perform(curl) ; //how to get curl response here instead of in main function ???? } int main() { ostringstream oss; curlCall(oss); //i can get response here by calling the following code cout lt;lt; oss.str(); return 0; }
Комментарии:
1. Потому
ostream
что это базовый класс дляostringstream
2. Используйте часть №1?…
3. @Jarod42 , Но проблема в том , что я работаю над исправлением некоторых ошибок . итак , в основном существующий код заключается в том, что мы отправляем объект ostringstream функции, которая выполняет операции curl параметр функции curl, который принимает объект ostringstream, относится к типу ostream . из-за этого я не могу обработать ответ curl, потому что функция ostringstream не работает в функции curl
4. Может быть, предоставить соответствующий код (или даже лучшую упрощенную версию)?
5. преобразования не являются симметричными. Вы можете сделать таблицу из дерева, но наоборот не так просто
Ответ №1:
как получить ответ curl здесь, а не в основной функции ????
void curlCall(ostreamamp; os)
не предназначен для этого. Таким образом, вы можете сделать одно из следующих действий:
- измените
curlCall
интерфейс, чтобы он мог это делать (что означает изменениеostream
типа параметра наostringstream
) - не делай этого в
curlCall
Если вы хотите сделать это curlCall
без изменения curlCall
интерфейса, то у вас есть противоречивые требования.
Ответ №2:
Глядя на ваш ответ на ответ Jarod42, кажется, что это скорее проблема рефакторинга. Ваша проблема в том, что вы переходите от ostream -gt; ostringstream -gt;gt; ostream, возможное решение заключается в том, что вы должны просто сохранить функцию в общем виде и вместо этого использовать ostream или разделить две функции.
Комментарии:
1. Взгляните на обновленный код