我是一个完整的c ++ noob。开始从java学习它。因此,在经过一些教程的深入研究后,我最终得到了这个名为Token的类:
#include "Token.h"
#include <iostream>
using namespace std;
//int Token::frequency = 0;
Token::Token() {
// TODO Auto-generated constructor stub
frequency=0;
tok = "hey i am created";
cout << tok << endl; // prints !!!Hello World!!!
}
Token::~Token() {
// TODO Auto-generated destructor stub
}
这个类的标题是:
#ifndef TOKEN_H_
#define TOKEN_H_
#include <string>
class Token {
std::string tok;
int frequency;
public:
Token();
virtual ~Token();
};
#endif /* TOKEN_H_ */
在教程中看起来很好。错误是我在我的主类中调用它时:
#ifndef TOKEN_H_
#define TOKEN_H_
#include <iostream>
using namespace std;
int main() {
Token myToken;
cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!!
return 0;
}
#endif /* TOKEN_H_ */
错误说:
Tokenizer.cpp:15:8:错误:'myToken'之前预期';'
Whyyy?我在这里查看了教程和答案,看起来我做得对吗?到底是怎么回事?而且,如果你看到我做了一些其他废话,请告诉我,我会感激,我刚从Java转到C ++ ...
答案 0 :(得分:6)
#ifndef TOKEN_H_
函数周围有main
,这没有任何意义。 #ifndef
被称为标头保护,它用于保护标头不被多次包含。您的主要功能应该进入源文件(.c或.cpp等)。您不需要源文件中的标题保护,因为它们不包含在其他源文件中。
你需要你的main.cpp文件是这样的:
#include <iostream>
#include "token.h"
// other stuff, like the using namespace
int main() { /* then your main function. */ }
实际上,大多数源文件都遵循这种模式。这与构建Token.cpp文件的模式相同。
答案 1 :(得分:4)
您需要包含班级的实际标题
#include "Token.h"
这样,类定义可用,您可以在Token
main
的实例
这些是标题/包含警卫,您在主文件中不需要它们
#ifndef TOKEN_H_
#define TOKEN_H_
答案 2 :(得分:1)
您没有包含令牌标头#include "token.h"
,因此,编译器认为Token myToken;
是定义而不是声明,也不需要标头保护
答案 3 :(得分:0)
从main.c文件中删除Token.h
警卫。还包括main中的 var res = query.GroupBy( b => b.CreatedDate.ToString() ).Select(c => new
{
ShredQueueCount = c.Sum(w => w.ShredQueueCount),
ShredCompletedCount = c.Sum(w => w.ShredCompletedCount),
ShredValFailureCount = c.Sum(w => w.ShredValFailureCount),
ShredExceptionCount = c.Sum(w => w.ShredExceptionCount),
CreatedDate = c.Select(w => w.CreatedDate)
});
标题。