- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
<分区>
我正在尝试用 C++ 编译程序,但编译器返回此错误:
operadoraarquivos.o: In function `split(std::string, int&)':
operadoraarquivos.cpp:(.text+0x0): multiple definition of `split(std::string, int&)'
main.o:main.cpp:(.text+0x0): first defined here
Hash.o: In function `HashTable::HashTable(int)':
Hash.cpp:(.text+0x65): undefined reference to `Lista<Palavra>::Lista()'
Hash.cpp:(.text+0xba): undefined reference to `Lista<Palavra>::~Lista()'
Hash.o: In function `HashTable::~HashTable()':
Hash.cpp:(.text+0x134): undefined reference to `Lista<Palavra>::~Lista()'
Hash.o: In function `HashTable::inserir(std::string, int)':
Hash.cpp:(.text+0x2d0): undefined reference to `Lista<Palavra>::vazia()'
Hash.cpp:(.text+0x31b): undefined reference to `Lista<Palavra>::buscar(Palavra)'
Hash.cpp:(.text+0x34d): undefined reference to `Lista<int>::Lista()'
Hash.cpp:(.text+0x365): undefined reference to `Lista<int>::inserir(int)'
Hash.cpp:(.text+0x3a5): undefined reference to `Lista<Palavra>::inserir(Palavra)'
Hash.cpp:(.text+0x3ce): undefined reference to `Lista<int>::inserir(int)'
Hash.cpp:(.text+0x3e7): undefined reference to `Lista<int>::Lista()'
Hash.cpp:(.text+0x3ff): undefined reference to `Lista<int>::inserir(int)'
Hash.cpp:(.text+0x43f): undefined reference to `Lista<Palavra>::inserir(Palavra)'
Hash.o: In function `HashTable::buscar(std::string)':
Hash.cpp:(.text+0x590): undefined reference to `Lista<Palavra>::buscar(Palavra)'
Hash.o: In function `HashTable::imprimir(std::string)':
Hash.cpp:(.text+0x6d5): undefined reference to `Lista<int>::imprimir()'
collect2: error: ld returned 1 exit status*****
命令:g++ -o busca main.o operadoraarquivos.o Lista.o Hash.o
如何解决这个错误?谢谢
main.cpp
#include "operadoraarquivos.hpp"
int main(int argc, char* argv[]) {
OperadoraArquivos opArq(argv[1], argv[2], argv[3]);
opArq.imprimirBusca();
opArq.~OperadoraArquivos();
}
operadoraarquivos.cpp
#include "operadoraarquivos.hpp"
OperadoraArquivos::OperadoraArquivos(string livro, string sw, string buscas) {
this->livro.open(livro.c_str(), ios_base::in);
this->sw.open(sw.c_str(), ios_base::in);
this->buscas.open(buscas.c_str(), ios_base::in);
this->resultados.open(ARQ_RESULTADOS, ios_base::out);
this->ht = new HashTable(8388593); // 8388593 < 2^23
stopwords = new string[335];
// while (!sw.eof())
// getline(sw, stopwords[i++]);
int i = 0;
while (getline(this->sw, stopwords[i++]));
string linha;
for ( i = 1; !this->livro.eof(); i++) {
getline(this->livro, linha);
int n;
string *palavras = split(linha, n);
for (int j = 0; j < n; j++) {
if (deveGuardar(palavras[j]))
ht->inserir(palavras[j], i);
}
}
}
OperadoraArquivos::~OperadoraArquivos() {
this->livro.close();
this->buscas.close();
this->resultados.close();
this->sw.close();
}
bool OperadoraArquivos::deveGuardar(string str) {
int baixo = 0, alto = 334, meio;
while (baixo <= alto) {
meio = (baixo + alto) / 2;
if (str == stopwords[meio])
return true;
else {
if (str > stopwords[meio])
baixo = meio;
else
alto = meio;
}
}
return false;
}
string OperadoraArquivos::paraMaiuscula(string str) {
string result = "";
for ( std::string::iterator it=str.begin(); it!=str.end(); ++it)
result += toupper(*it);
return result;
}
void OperadoraArquivos::imprimirBusca() {
string temp;
while (getline(buscas, temp)) {
ht->imprimir(temp);
}
}
operadoraarquivos.hpp
#ifndef OPERADORAARQUIVOS_H
#define OPERADORAARQUIVOS_H
#include <iostream>
#include <fstream>
#include <cctype>
#include "Hash.hpp"
#define ARQ_RESULTADOS "resultados.txt"
string* split(string str, int &n) {
int contador = 0;
for ( string::iterator it=str.begin(); it!=str.end(); ++it) {
if (*it == ' ')
contador++;
}
string *tokens = new string[contador+1]();
int i = 0;
for (string::iterator it=str.begin(); it!=str.end(); ++it) {
if (*it == ' ')
i++;
tokens[i] += *it;
}
n = i + 1;
return tokens;
}
class OperadoraArquivos
{
private:
string* stopwords;
ifstream livro;
ifstream sw;
ifstream buscas;
ofstream resultados;
bool deveGuardar (string str);
string paraMaiuscula (string str);
HashTable* ht;
public:
OperadoraArquivos(string livro, string sw, string buscas);
~OperadoraArquivos();
HashTable* getHashTable();
void imprimirBusca();
};
#endif // OPERADORAARQUIVOS_H
哈希.cpp
#include "Hash.hpp"
#include "Lista.hpp"
HashTable::HashTable(int max) {
vetorListas = new Lista<Palavra>[max]();
this->max = max;
}
HashTable::~HashTable() {
delete[] vetorListas;
}
int HashTable::hash (string str) {
Posicao indice = 0;
int expoente = 0;
for ( std::string::iterator it=str.begin(); it!=str.end(); ++it)
indice += (*it) * pow(128,expoente++);
indice %= max;
}
void HashTable::inserir(string texto, int linha) {
Palavra palavra;
Posicao indice = hash(texto);
palavra.chave = indice;
palavra.texto = texto;
if (!vetorListas[indice].vazia())
{
No<Palavra>* no = vetorListas[indice].buscar(palavra);
if (!no) {
palavra.lista = new Lista<int>();
palavra.lista->inserir(linha);
vetorListas[palavra.chave].inserir(palavra);
}
else {
no->item.lista->inserir(linha);
}
}
else {
palavra.lista = new Lista<int>();
palavra.lista->inserir(linha);
vetorListas[indice].inserir(palavra);
}
}
No<Palavra>* HashTable::buscar (string texto) {
Palavra palavra;
palavra.texto = texto;
palavra.chave = hash(texto);
return vetorListas[palavra.chave].buscar(palavra);
}
No<Palavra>* HashTable::operator[] (string texto) {
return buscar(texto);
}
void HashTable::imprimir(string texto) {
No<Palavra>* no = this->buscar(texto);
cout << texto << " ";
no->item.lista->imprimir();
}
哈希.hpp
#ifndef LISTA_H
#define LISTA_H
#include <iostream>
using namespace std;
typedef int chave;
typedef int Posicao;
template <class T>
class No {
public:
T item;
No<T> *proximo;
};
template <class T>
class Lista {
private:
No<T> *prim, *ult;
void flVazia();
public:
Lista();
~Lista();
bool vazia();
void inserir(T x);
void retira(No<T> *p);
//No<T>* buscar(Posicao pos);
No<T>* buscar(T item);
void imprimir();
//void imprimeChave(Item item);
};
#endif
Lista.cpp
#include "Lista.hpp"
template <class T>
Lista<T>::Lista() {
flVazia();
}
template <class T>
Lista<T>::~Lista() {
while (!vazia())
retira(ult);
}
template <class T>
void Lista<T>::flVazia() {
prim = new No<T>();
//prim->item = {0,0};
ult = prim;
ult->proximo = NULL;
}
template <class T>
bool Lista<T>::vazia(){
return prim == ult;
}
template <class T>
void Lista<T>::inserir(T x) {
ult->prox = new No<T>();
ult = ult->prox;
ult->item = x;
ult->proximo = NULL;
}
template <class T>
void Lista<T>::retira(No<T> *p) {
if (vazia() || p == NULL || p->prox == NULL) {
cout << "Erro: Retirada impossivel" << endl;
}
else {
No<T> *q = p->prox;
p->prox = q->prox;
if (p->prox == NULL) ult = p;
delete(q);
}
}
/*No<T>* Lista<T>::buscar(Posicao pos) {
int i=0;
for (No *p = prim; p!=NULL; p=p->prox) {
if (pos == i)
return p;
++i;
}
return NULL;
}*/
template <class T>
No<T>* Lista<T>::buscar(T item) {
for (No<T> *p = prim; p!=NULL; p=p->prox) {
if (p->item == item)
return p;
}
return NULL;
}
/*template <class T>
No<T>* Lista<T>::operator[](Posicao pos)
{
return buscar(pos);
}*/
template <class T>
void Lista<T>::imprimir() {
for (No<T>* p = prim; p!=NULL; p=p->prox) {
cout << p->item;
if (p->prox!=NULL)
cout << " ";
}
cout << endl;
}
Lista.hpp
#ifndef LISTA_H
#define LISTA_H
#include <iostream>
using namespace std;
typedef int chave;
typedef int Posicao;
template <class T>
class No {
public:
T item;
No<T> *proximo;
};
template <class T>
class Lista {
private:
No<T> *prim, *ult;
void flVazia();
public:
Lista();
~Lista();
bool vazia();
void inserir(T x);
void retira(No<T> *p);
//No<T>* buscar(Posicao pos);
No<T>* buscar(T item);
void imprimir();
//void imprimeChave(Item item);
};
#endif
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!