Я новичок. Я попытался написать шаблонную функцию, которая получает строку И числовые данные (например, douubles) из текстового файла, а затем помещает его в вектор. Каждый элемент вектора имеет другое имя или номер.
На прошлой неделе я спросил, лучше ли для этого перегрузка или шаблон. Я хотел бы пойти с методом шаблона, где вектор результатов (что я хочу) передается в функцию, чтобы обеспечить параметр шаблона T. Но у меня есть проблемы. Если бы кто-нибудь мог помочь, я был бы благодарен! Код ниже, сопровождаемый ошибкой, которую я получаю.
// Мой код:
template<typename T>
void readFile( const std::string& name, const std::string& find, std::vector<T>& results ){
std::ifstream file( name.c_str( ) );
std::string line;
while( std::getline( file, line ) )
{
if( line == find )
{
std::getline( file, line );
line.erase(remove( line.begin(), line.end(), '\'' ), line.end() );
std::istringstream streamLine( line );
results = std::vector<T>( std::istream_iterator<T>(streamLine), std::istream_iterator<T>() );
}
}
}
Позвонить на главную ():
readFile( name, "label", results );
Ошибка, которую я получаю, ниже. Я не понимаю, как вызов функции не соответствует определению. Заранее извиняюсь за любые глупые ошибки!
error: no matching function for call to
'std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >,
std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >
::resize(std::basic_string<char, std::char_traits<char>, std::allocator<char> >&)'
Странная вещь в том, что если я заставлю функцию возвращать вектор «результат» вместо void, то все будет работать. Вот что я имею в виду:
std::vector<T> readFile( const std::string& name, const std::string& find, std::vector<T>& results )
с оператором возврата в определении функции:
return std::vector<T>( std::istream_iterator<T>(streamLine), std::istream_iterator<T>() );
Но это кажется неуклюжим / плохим стилем сделать это таким образом. Я бы подумал, что использование ссылок будет лучше. Даже если это не лучше, мне любопытно узнать, почему первый метод (с void) не работает.
Любые советы приветствуются!