- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
对不起!我有另一个问题。这是我试图解决的第一个最终错误。
我在头文件 PlagiarismDetector.h 的类定义中遇到错误:
#include <vector> // std::vector
#include <string> // std::string
#include <fstream> // std::ifstream
#include <set> // std::set
class TextDocsCmpr {
public:
TextDocsCmpr();
~TextDocsCmpr();
void addFile(std::string);
void setThreshold(double);
private:
std::vector<std::string> files_vec;
std::vector<std::string> get_file_sntncs(std::fstream&);
std::vector<std::string> get_sntnc_wrds(const std::string&);
double sntnc_smlrty_qtnt(std::vector<std::string>, std::vector<std::string>);
static std::set<char> LETTERS_SET;
double sntnc_smlrty_thrshld;
static const double SNTNC_SMLRTY_THRSHLD_DEFAULT = 0.5;
};
我不明白为什么它说我正在尝试重新定义它。对应的cpp文件为:
#include "PlagiarismDetector.h"
#include <iostream> // std::cout, std::endl
#include <algorithm> // std::swap
#include <map> // std::map
// ------------------------------------ TextDocsCmpr class member functions -----------------------------------------
// ---------- Public functions ------------
// Default constructor
TextDocsCmpr::TextDocsCmpr() {
// Set the sentence similarity threshold to its default value
sntnc_smlrty_thrshld = SNTNC_SMLRTY_THRSHLD_DEFAULT;
// Add all the characters of LETTERS_ARR to LETTERS_SET
const char LETTERS_ARR[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D',
'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S',
'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '\'', '.'};
for (int i = 0; i < sizeof(LETTERS_ARR)/sizeof(char); ++i)
LETTERS_SET.insert(LETTERS_ARR[i]);
}
// Trivial destructor
TextDocsCmpr::~TextDocsCmpr() {}
// Add file to files_vec (if file is found)
void TextDocsCmpr::addFile(std::string filename) {
files_vec.push_back(filename);
}
// Sets the sentence comparison threshold value
void TextDocsCmpr::setThreshold(double t) {
if (t < 0 || t > 1) {
// Print error for now. Will change to an error window later.
std::cout << "Threshold not changed. Must be bewteen 0 and 1 inclusive" << std::endl;
} else {
sntnc_smlrty_thrshld = t;
}
}
// ---------- Private functions --------------
// Extract sentences from Plain Text file
std::vector<std::string> TextDocsCmpr::get_file_sntncs(std::fstream& file) {
// The sentences will be stored in a vector of strings, strvec:
std::vector<std::string> strvec;
// Print out error if the file could not be found:
if(file.fail()) {
std::cout << "Could not find the file. :( " << std::endl;
// Otherwise, proceed to add the sentences to strvec:
} else {
char curchar;
std::string cursentence;
/* While we haven't reached the end of the file, add the current character to the
string representing the current sentence. If that current character is a period,
then we know we've reached the end of a sentence if the next character is a space,
a quotation mark (to denote the end of a quoted sentence), a new line character or
if there is no next character; and we must then add the current sentence to strvec. */
while (file >> std::noskipws >> curchar) {
cursentence.push_back(curchar);
if (curchar == '.') {
if (file >> std::noskipws >> curchar) {
if (curchar == ' ' || curchar == '"' || curchar == '\n') {
strvec.push_back(cursentence);
cursentence.clear();
} else {
cursentence.push_back(curchar);
}
} else {
strvec.push_back(cursentence);
cursentence.clear();
}
}
}
}
return strvec;
}
std::vector<std::string> TextDocsCmpr::get_sntnc_wrds(const std::string& S) {
// The words of the sentence will be stored as a vector of strings and returned.
std::vector<std::string> retvec;
std::string::const_iterator it = S.begin();
while (it != S.end()) {
if (LETTERS_SET.count(*it) == 1) {
/* We've found a letter. Now let us place all the consecutive letters
into a string which will be added to our vector of strings, retvec. */
std::string str(1,*it);
int k(0);
while (((it+k+1) != S.end()) && (LETTERS_SET.count(*(it+k+1)) == 1)) {
str.push_back(*(it + (++k)));
}
retvec.push_back(str);
it += (k+1);
}
else {
// Or if we didn't find a letter, advance the iterator the unit.
++it;
}
}
return retvec;
}
double TextDocsCmpr::sntnc_smlrty_qtnt(std::vector<std::string> S1, std::vector<std::string> S2) {
// Force s1 to be the smaller sentence.
if (S1.size() > S2.size())
swap(S1, S2);
// Add all the words of s1 to a set.
std::set<std::string> wordset;
for (std::vector<std::string>::const_iterator it = S1.begin(); it != S1.end(); ++it)
wordset.insert(*it);
// Save the number of unique words in s1.
int oldsize = wordset.size();
// Add the words of s2 to the set.
for (std::vector<std::string>::const_iterator it = S2.begin(); it != S2.end(); ++it)
wordset.insert(*it);
/* The difference between oldsize and the current size of wordset is the number of words in
s2 which are not in s1. Therefore the proportion of words of s1 contained in s2 is oldsize/wordset.size().
This is the sentence similarity quotient which is returned. */
return (double)oldsize/(double)wordset.size();
}
// ----------------------------------------------------------------------------------------------------------
最佳答案
您可能在单个源文件中多次包含 PlagiarismDetector.h
,可能间接通过另一个头文件。
为了防止这种情况,您应该使用 include guards .
关于c++ - 错误 : redefinition of 'class TextDocsCmpr' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20280576/
我正在尝试制作一个压缩和解压缩文件的程序。我想为操作类型创建这样的枚举:typedef enum { COMPRESS, DECOMPRESS } operation;。问题是,我收到 4 个错误:
此代码会导致编译错误“错误:使用不同类型重新定义'p'”: void fun() { printf("fun"); } void (*p)(); p = &fun; 但是如果修改 void (
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 8 年前。 Improve t
这个问题在这里已经有了答案: Avoiding "redefinition of typedef" warnings when defining structs (2 个答案) 关闭 5 年前。 我
对于以下使用 Visual C++ 2010 的代码,我有一个奇怪的编译警告: #include class test { public: template
我有两个库(第三方),在每个库中,它们都定义了两个同名的类(在头文件中)。 // Lib A, HeaderA.h struct mycompare { //Some code }; // Lib B
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 5年前关闭。 Imp
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我正在处理类里面的一个问题。它是关于创建一个“addressType”类,并使用它与已经写出的主函数进行交互。该程序无法运行,我得到的主要错误是“addressType.cpp:6:7: error:
我的 C++ 代码有一些问题。我现在正在尝试拆分一个头文件,该文件具有一些 char 指针的定义和声明(以前是字符串,但我遇到了一些 CRT 问题,因此将它们更改为 char 指针)。由于我已将它们更
我已经很久不用C++了,对它不是很友好。我正在恢复我的一个旧项目并尝试编译它,但我在启动 Makefile 时收到以下错误输出: g++ -W -ggdb3 -Wall -ansi -pedantic
我正在尝试构建一个链表,但我一开始就卡住了——我是一个完全的初学者。如何定义结构? 这是我收到的错误消息: 8 8 C:\Users\user\Desktop\list_funcs.c [错误] 's
这是我的代码: // in main.cpp #include "iostream" #include "circle.cpp" #include "rectangle.cpp" #include "
我有一个 iOS xcode 项目,当我选择 Generic iOS Device 作为我的目的地时,它构建得很好。但是,当我选择任何模拟器选项时,我的构建失败并出现许多 Redefinition o
我正在尝试将用户空间库链接到 Windows 内核驱动程序。它引用了 __iob_func,它是“libcmt.lib”(用户空间库)的一部分。我无法在 winddk 中访问此功能。因此,我计划为 _
在下面的代码中: typedef struct { union U { int a; char b; }U1;
我正在做一个大项目,我收到这个警告: ...\include\stddef.h" 38/9] macro "NULL" redefined ...\ncs_types.h" 125/13] previ
我在这里有这段代码,并且出现了GCC错误:在此代码的开头重新定义了union semun。 union semun { int val; /* Value fo
我是 javascript/typescript 开发人员,但对 Arduino/c++ 很陌生 我有一个类(见下面的 h 和 cpp)并且有这个编译器错误: DotMatrix.cpp:13:1:
我遇到了奇怪的错误,其中大多数涉及第 9-12 行(函数声明),但我找不到问题。请帮助我:) 谢谢 代码: #include #include #include #include #defin
我是一名优秀的程序员,十分优秀!