Как преобразовать класс a в класс b в c

#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. Взгляните на обновленный код