错误:没有匹配的函数可以调用“ std :: vector< std :: vector< int>> ::: push_back(std :: vector&std :: __ cxx11 :: basic_string< char>&))”
我正在尝试从我的主管调试此代码,并且我是C ++的新手。
I am trying to debug this code from my supervisor and I'm new to C++.
我发现了一些类似的 没有匹配的函数来调用
问题,这使我知道问题可能是什么,但无法解决。
I found a few similar no matching function for call to
questions, which gave me ideas what the problem might be but was not able to solve it.
我在错误消息和相关功能下方列出了我的想法。
I have listed my thoughts below the error message and relevant function.
错误消息:
In function ‘int main(int, char**)’:
distanceMatrixToSageGraph.c:104:43: error: no matching function for call to
‘std::vector<std::vector<int>>::push_back(std::vector<std::__cxx11::basic_string<char> >&)’
the_entries.push_back( row_as_vector );
相关功能:
int main(int argc, char** threshold_and_distanceMatrixfilename)
{
if (argc < 2 || argc > 2)
{
std::cerr << "Usage: ./distanceMatrixToSageGraph.o <threshold>
<distanceMatrix_file_calculated_fromDGEsingleCell_data>" << std::endl;
return -1;
}
string distanceMatrixfilename = threshold_and_distanceMatrixfilename[2];
int threshold = std::stoi(threshold_and_distanceMatrixfilename[1]);
std::ifstream distanceMatrixFile(distanceMatrixfilename);
if (!distanceMatrixFile)
{
std::cerr << "Error opening distanceMatrix file: " << distanceMatrixfilename << std::endl;
return -1;
}
string row;
std::getline(distanceMatrixFile, row); // discard the first row, which specifies the format of the file.
vector<vector<int>> the_entries;
while (std::getline(distanceMatrixFile, row))
{
std::stringstream row_as_stringstream(row);
int i; i = 0;
vector<string> row_as_vector;
while (row_as_stringstream.good())
{
string substr;
getline(row_as_stringstream, substr, ',');
row_as_vector.push_back(substr);
};
the_entries.push_back(row_as_vector); //LINE 104
};
}
想法:
- 如果有人可以向我解释,那就太好了:
std :: vector< std :: vector< int>> ::: push_back( std :: vector< std :: __ cxx11 :: basic_string< char>&)
- 我知道
std :: vector< std :: vector< int>>
是一个矩阵,而
是push_back
在该向量的末尾添加一个元素 - 我怀疑我们试图以错误的类型读取
the_entries.push-back(row_as_vector)
。 -
原始代码将
csv
文件作为输入,其中包含integers
和字符串
。现在,我们正在读取具有形状的txt
文件:
- It would be great if someone could explain to me:
std::vector<std::vector<int>>::push_back(std::vector<std::__cxx11::basic_string<char>>&)
- I understand that
std::vector<std::vector<int>>
is a matrix and thatpush_back
adds an element at the end of the vector. - I suspect that we're trying to read in the wrong type in
the_entries.push-back(row_as_vector)
. The original code took a
csv
file as input, containingintegers
andstrings
. Now we're reading in atxt
file having the shape:
TEXT
0; INT; INT; INT; INT; ...
0; INT; INT; INT; INT; ...
以上数字和分号的另外18行
在上面,我们删除了 89 。
是否可能需要对代码进行更多更改才能使用
阅读此 txt
文件而不是 csv
文件?
Is it possible the code has to be changed much more to be able to
read this txt
file instead of the csv
file?
其他错误消息:
In file included from /usr/include/c++/6/vector:64:0,
from distanceMatrixToSageGraph.c:13:
/usr/include/c++/6/bits/stl_vector.h:914:7: note: candidate: void std::vector<_Tp, _Alloc>::push_back(const value_type&) [with _Tp = std::vector<int>; _Alloc = std::allocator<std::vector<int> >; std::vector<_Tp, _Alloc>::value_type = std::vector<int>]
push_back(const value_type& __x)
^~~~~~~~~
/usr/include/c++/6/bits/stl_vector.h:914:7: note: no known conversion for argument 1 from ‘std::vector<std::__cxx11::basic_string<char> >’ to ‘const value_type& {aka const std::vector<int>&}’
/usr/include/c++/6/bits/stl_vector.h:932:7: note: candidate: void std::vector<_Tp, _Alloc>::push_back(std::vector<_Tp, _Alloc>::value_type&&) [with _Tp = std::vector<int>; _Alloc = std::allocator<std::vector<int> >; std::vector<_Tp, _Alloc>::value_type = std::vector<int>]
push_back(value_type&& __x)
^~~~~~~~~
/usr/include/c++/6/bits/stl_vector.h:932:7: note: no known conversion for argument 1 from ‘std::vector<std::__cxx11::basic_string<char> >’ to ‘std::vector<std::vector<int> >::value_type&& {aka std::vector<int>&&}’
整个代码:
// Convert distanceMatrix tables of protein interactions to SAGE graph.
///////////////////////////////////////////////////////////////////////////
#include <iostream>
#include <fstream>
#include <sstream>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <list>
#include <vector>
#include <tuple>
#include <algorithm>
using namespace std;
void writeGraphInSageFormat(string name, std::vector<std::vector<int>> TheEdges)
{
//////////////////////////////////////////////////////////////////////////////////////
// Write out the edges in SAGE format.
///////////////////////////////////////////////////////////////////////////////////////
int edgeNumber = TheEdges.size();
ofstream d1sageFile(name, ios::out);
d1sageFile << "g = Graph([" << endl;
for (int n = 0; n < edgeNumber; n++) {
d1sageFile << "(" << TheEdges[n][0] + 1 << "," << TheEdges[n][1] + 1 << ")," << endl;
}
d1sageFile << "])" << endl;
d1sageFile << "g.show()" << endl;
d1sageFile.close();
std::cout << "SAGE graph written into the file " << name << std::endl;
}
std::vector<std::vector<int>> ConvertEntriesMatrixToEdges(vector<vector<int>> the_entries, int threshold)
{
////////////////////////////////////////////////////////////////////////////////////////////
// Construct the edge-vertex incidence matrix (d_1) from the distanceMatrix entries matrix:
////////////////////////////////////////////////////////////////////////////////////////////
std::vector<std::string> proteinNames;
std::vector<std::vector<int>> TheEdges;
std::cout << "Registering only edges shorter than " << threshold << "." << std::endl;
int thisDistance;
for (int i = 0; i < the_entries.size(); i++)
{
for (int j = i + 1; j < the_entries.size(); j++)
{
// we could use the_entries.size() instead of the_entries.at(i).size(), because this is a square matrix.
thisDistance = the_entries.at(i).at(j);
if (thisDistance < threshold)
{
std::vector<int> CurrentEdge(2);
CurrentEdge[0] = i;
CurrentEdge[1] = j;
TheEdges.push_back(CurrentEdge);
};
};
};
return TheEdges;
}
///////////////////////////////////////////
// Main Program: Extract edges from a distanceMatrix file.
///////////////////////////////////////////
int main(int argc, char** threshold_and_distanceMatrixfilename)
{
if (argc < 2 || argc > 2)
{
std::cerr << "Usage: ./distanceMatrixToSageGraph.o <threshold> <distanceMatrix_file_calculated_fromDGEsingleCell_data>" << std::endl;
return -1;
}
string distanceMatrixfilename = threshold_and_distanceMatrixfilename[2];
int threshold = std::stoi(threshold_and_distanceMatrixfilename[1]);
std::ifstream distanceMatrixFile(distanceMatrixfilename);
if (!distanceMatrixFile) {
std::cerr << "Error opening distanceMatrix file: " << distanceMatrixfilename << std::endl;
return -1;
}
string row; //LINE 88
std::getline(distanceMatrixFile, row); // discard the first row, which specifies the format of the file.
vector<vector<int>> the_entries;
while (std::getline(distanceMatrixFile, row))
{
std::stringstream row_as_stringstream(row);
int i; i = 0;
vector<string> row_as_vector;
while (row_as_stringstream.good())
{
string substr;
getline(row_as_stringstream, substr, ',');
row_as_vector.push_back(substr);
};
the_entries.push_back(row_as_vector); //LINE 104
};
////////////////////////////////////////////////////////////
// Now we assemble the entries to an edges matrix, and write it into a Sage file:
////////////////////////////////////////////////////////////
std::vector<std::vector<int>> TheEdges = ConvertEntriesMatrixToEdges(the_entries, threshold);
char outputFilename[60]; strcpy(outputFilename, distanceMatrixfilename.c_str()); strcat(outputFilename, "AtThreshold"); string thrshld = std::to_string(threshold); strcat(outputFilename, thrshld.c_str()); strcat(outputFilename, ".txt");
writeGraphInSageFormat(outputFilename, TheEdges);
return 0;
}
我怀疑我们试图在
the_entries.push-back(row_as_vector)
I suspect that we're trying to read in the wrong type in the_entries.push-back(row_as_vector)
error: no matching function for call to
‘std::vector<std::vector<int>>::push_back(std::vector<std::__cxx11::basic_string<char> >&)’
the_entries.push_back( row_as_vector );
是,您对此有权。错误消息表明您正在尝试将字符串的向量推回整数向量的向量。它们是完全不同的类型,因此不可能。
Yes, your right about this. The error message says that you are trying to push back a vector of strings to a vector of vector of integers. They are entirely different types and hence not possible.
您可能想要将 the_entries
的类型更改为
You probably want to either change the type of the_entries
to
std::vector<std::vector<std::string>> the_entries;
// ^^^^^^^^^^^^
或
使用 std :: stoi
,同时返回到 std :: vector< int> row_as_vector
。
std::vector<int> row_as_vector;
while(row_as_stringstream.good())
{
// ......
row_as_vector.push_back(std::stoi(substr));
// ^^^^^^^^^^^^^^^^^^^
};
the_entries.push_back( row_as_vector );
是否可能必须对代码进行更多更改才能读取
此txt
文件,而不是csv
文件?
如果这两个文件的内容相同,则无需在代码中做很大的改变。但是,应该解析出;
,然后再调用 std :: stoi
。因为它可能通过 invalid_argument
If the contents of those two are same, you don't need to make much difference in your code. However, ;
should be parsed out before calling std::stoi
to them. Because it may through invalid_argument exception for the bad argument.
一些建议:
- 考虑不要使用命名空间std; 练习
。有关更多信息,请参见此帖子
:
为什么是使用命名空间标准;被认为是不好的做法? - 当您传递非原始类型(即
std :: string
,std :: vector
..等),请考虑这种情况,无论
参数是否为只读。如果应该修改数据
pass-by-ref ,并且如果它是只读的(函数内部不应进行任何修改),则通过 const-ref 。了解更多:
如何将对象传递给C ++中的函数?
- Consider not to practice with
using namespace std;
. See this post for more: Why is "using namespace std;" considered bad practice? - When you pass the non-primitive types(i.e.
std::string
,std::vector
.. etc) to the function, consider the case, if the parameters are read-only or not. If the data should be modified pass-by-ref and if read-only(no modification should have been made inside the function) pass them by const-ref. Read more: How to pass objects to functions in C++?