我是新手。我试图编写一个模板函数,从文本文件中获取字符串和数字数据(例如, double ),然后将其放入 vector 中。 vector 的每个元素都是不同的名称或编号。
上周我问过重载或模板是否最适合这个问题。我想使用模板方法,将结果 vector (我想要的)传递给函数以提供模板参数 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>() );
}
}
}
在 main() 中调用:
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> >&)'
奇怪的是,如果我让函数返回 vector “result”而不是 void,那么一切似乎都有效。这就是我的意思:
std::vector<T> readFile( const std::string& name, const std::string& find, std::vector<T>& results )
在函数定义中有一个return语句:
return std::vector<T>( std::istream_iterator<T>(streamLine), std::istream_iterator<T>() );
但这样做似乎笨拙/糟糕。我原以为使用引用会更好。即使它不是更好,我也很想知道为什么第一种方法(使用 void)不起作用。
如有任何提示,我们将不胜感激!
最佳答案
我必须做很多工作才能使它成为一个完全可编译的代码片段。这是我想出的:
#include <string>
#include <vector>
#include <istream>
#include <fstream>
#include <iterator>
#include <sstream>
#include <algorithm>
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>() );
}
}
}
void do_it_with_strings(std::vector<std::string> &results)
{
readFile("fred", "barney", results);
}
此代码片段在 gcc 4.5.1 下编译得很好。 main
函数中 name
和 results
的确切类型是什么?此外,问题似乎是调用 vector 的 resize
函数。您似乎没有直接在代码中执行此操作,尽管 vector 构造函数或赋值运算符可能在内部执行此操作。
但无论如何,我都不建议您以这种方式编写代码。我建议您改为这样做:
#include <string>
#include <vector>
#include <istream>
#include <fstream>
#include <iterator>
#include <sstream>
#include <algorithm>
template<typename T>
std::vector<T> readFile(const std::string& name, const std::string& find )
{
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 );
return std::vector<T>( std::istream_iterator<T>(streamLine),
std::istream_iterator<T>() );
}
}
return std::vector<T>();
}
void do_it_with_strings(std::vector<std::string> &results)
{
results = readFile<std::string>("fred", "barney");
}
在这样的函数中,我认为最好在调用该函数时明确说明您希望读取的类型,而不是根据您的 vector
类型隐式确定它传入。
关于C++ 新手 : template function problem--getting string and numerical data from text file, 将其放入 vector 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4922191/