Ошибка преобразования потока строк - PullRequest
1 голос
/ 06 июля 2011

Я когда-либо использовал следующий фрагмент кода в одном классе.Сегодня я скопировал его в другой класс.При компиляции я получил следующие ошибки.Странно, что такое действительно произошло!Не могли бы вы сказать, в чем дело?Спасибо.

Я только что использовал следующий фрагмент кода для тестирования в демонстрационном проекте.Я бежал, как талисман!

int main()
{  
   char buffer[] = "I1 I2 V1 V2 I3 V3 I4 DO V4";

   std::stringstream s(buffer); 
   std::istream_iterator<std::string> begin(s); 
   std::istream_iterator<std::string> end; 
   std::vector<std::string> IVector;
   std::vector<std::string> VVector;

   for ( ; begin != end; ++begin) 
   {     
       std::string sElem = *begin;

       switch((*begin)[0])
       {  
          case 'I':
            IVector.push_back( sElem);
            break;
          case 'V':
            VVector.push_back( sElem);
            break;
          default:
           ;
       }
   }

   return 0;
}

void ClassifyChannel(char* szBuffer)
{   
    // Empty vectors
    m_svIRChannels.clear();
    m_svVISChannels.clear();

    std::stringstream s(szBuffer); 
    std::istream_iterator<std::string> itBegin(s); 
    std::istream_iterator<std::string> itEnd; 

    for (; itBegin != itEnd; ++itBegin) 
    {     
        std::string sElem = *itBegin;

        // Switch on first character
        switch ((*itBegin)[0])
        {  
           // Infrared channel, such as IR1, IR2, IR3 (WV), and IR4
           case 'I':
           case 'W':
              // Insert into IR channel vector here 
              m_svIRChannels.push_back(sElem);
              break;
           // Visible channels, such as VIS, and VIS1KM
           case 'V':
              // Insert into VIS channel vector here 
              m_svVISChannels.push_back(sElem);
              break;
        }
    } 
} 

Сообщение об ошибке

error C2440: 'initializing' : cannot convert from 'std::string' to 'int'
1>        No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
1>f:\tips\tips\fy2hdf5dataiohandler.cpp(830) : error C2664: 'std::istream_iterator<_Ty>::istream_iterator(std::basic_istream<_Elem,_Traits> &)' : cannot convert parameter 1 from 'int' to 'std::basic_istream<_Elem,_Traits> &'
1>        with
1>        [
1>            _Ty=std::string,
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]
1>        and
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]    

Ответы [ 3 ]

3 голосов
/ 06 июля 2011

Какой компилятор вы используете?Ваш фрагмент кода прекрасно компилируется с VC10 на моей коробке.Вы забыли включить все правильные заголовочные файлы?Для этого фрагмента кода вам нужны эти 3 заголовка:

#include <string>
#include <sstream>
#include <iterator>

Поскольку VC10, <iterator> неявным образом не включается другими.Вы должны включить это самостоятельно.

0 голосов
/ 16 апреля 2019
#include <sstream> 

требуется включить.

Я пробовал в VS2017 и VS2019, и он работает, включая этот заголовок.

Ниже приведен пример кода, который я пробовал.

int main()
{
    string line = "asasas asasas asasas asasas must try";
    stringstream check1(line);
}
0 голосов
/ 06 июля 2011

Мое предположение;вы явно не сделали

#include <string>

Заголовки потока ввода-вывода просто имеют прямое объявление std::string, но этого недостаточно в вашем случае.Попробуйте явно включить заголовок string, чтобы решить эту проблему.

...