我正在尝试将此功能从Linux移植到Windows:
template<class TDescriptor, class F>
bool TemplatedVocabulary<TDescriptor,F>::loadFromBinaryFile(const std::string &filename) {
fstream f;
f.open(filename.c_str(), ios_base::in|ios::binary);
unsigned int nb_nodes, size_node;
f.read((char*)&nb_nodes, sizeof(nb_nodes));
f.read((char*)&size_node, sizeof(size_node));
f.read((char*)&m_k, sizeof(m_k));
f.read((char*)&m_L, sizeof(m_L));
f.read((char*)&m_scoring, sizeof(m_scoring));
f.read((char*)&m_weighting, sizeof(m_weighting));
createScoringObject();
m_words.clear();
m_words.reserve(pow((double)m_k, (double)m_L + 1));
m_nodes.clear();
m_nodes.resize(nb_nodes+1);
m_nodes[0].id = 0;
char buf[size_node];// fails
int nid = 1;
while (!f.eof()) {
f.read(buf, size_node);
m_nodes[nid].id = nid;
// FIXME
const int* ptr=(int*)buf;
m_nodes[nid].parent = *ptr;
//m_nodes[nid].parent = *(const int*)buf;
m_nodes[m_nodes[nid].parent].children.push_back(nid);
m_nodes[nid].descriptor = cv::Mat(1, F::L, CV_8U);
memcpy(m_nodes[nid].descriptor.data, buf+4, F::L);
m_nodes[nid].weight = *(float*)(buf+4+F::L);
if (buf[8+F::L]) { // is leaf
int wid = m_words.size();
m_words.resize(wid+1);
m_nodes[nid].word_id = wid;
m_words[wid] = &m_nodes[nid];
}
else
m_nodes[nid].children.reserve(m_k);
nid+=1;
}
f.close();
return true;
}
这一行:
char buf[size_node];
将无法编译,给出错误:
expression did not evaluate to a constant
。
我尝试过使用:
std::vector<char> buf(size_node)
和
char buf[size_node] = new char[];
但我看到同样的错误。看起来这与运行时常量与编译时间常数有关,如答案中所述:
Tuple std::get() Not Working for Variable-Defined Constant
但在这种情况下,我不确定如何解决这个问题。谢谢。
答案 0 :(得分:4)
应该是
char *buf = new char[size_node];
请记住在使用后删除内存。
或者,只需使用std::vector
即可。它更安全。
std::vector<char> buf(size_node);
然后你必须改变buf
的使用方式。例如:
f.read(buf, size_node);
应该成为
f.read(buf.data(), size_node); //Only C++11