【发布时间】:2016-03-18 12:45:07
【问题描述】:
所以我在尝试编译我的项目时收到以下编译错误:
g++ -Wall -c --std=c++11 source.cpp token.cpp
g++ -Wall -c --std=c++11 pascalToken.cpp
pascalWordToken.hpp:7:1: error: expected class-name before ‘{’ token
g++ -Wall -c --std=c++11 pascalWordToken.cpp
pascalWordToken.hpp:7:1: error: expected class-name before ‘{’ token`
以下代码已被截断以保持帖子尽可能小,我希望所有相关部分都存在。
token.hpp 基类接口
#ifndef TOKEN_HPP
#define TOKEN_HPP
#include "source.hpp"
class Token {
public:
Token(Source& source_ref);
// public getter methods
protected:
// protected member variables
void extract();
// more code ...
};
#endif // TOKEN_HPP
token.cpp 基类源码
#include "token.hpp"
Token::Token(Source& source_ref)
{
// initialization of some member variables
extract();
}
void Token::extract()
{
// some code
}
pascalToken.hpp 文件
#ifndef PASCAL_TOKEN_HPP
#define PASCAL_TOKEN_HPP
#include "token.hpp"
#include "source.hpp"
class PascalToken : public Token
{
protected:
PascalToken(Source& source_ref);
};
#endif // PASCAL_TOKEN_HPP
pascalToken.cpp 文件
#include "pascalToken.hpp"
PascalToken::PascalToken(Source& source_ref) : Token(source_ref) {}
pascalWordToken.hpp 文件
#ifndef PASCAL_WORD_TOKEN_HPP
#define PASCAL_WORD_TOKEN_HPP
#include "token.hpp"
#include "pascalToken.hpp"
#include "source.hpp"
class PascalWordToken : public PascalToken
{
public:
PascalWordToken(Source& source_ref);
protected:
void extract();
};
#endif // PASCAL_WORD_TOKEN_HPP`
pascalWordToken.cpp 文件
#include "pascalWordToken.hpp"
PascalWordToken::PascalWordToken(Source& source_ref) : PascalToken(source_ref)
{}
void PascalWordToken::extract()
{
// code ...
}
编辑:
source.hpp 文件
#ifndef SOURCE_HPP
#define SOURCE_HPP
#include <fstream>
#ifndef EOF
#define EOF '\0' // end-of-file
#endif
#define EOL '\n' // end-of-line
class Source {
public:
Source(std::ifstream& reader_ref);
// some code ....
private:
std::ifstream& m_reader_ref;
// some private member variables/methods
protected:
// some protected member variables
};
#endif // SOURCE_HPP
source.cpp 文件
#include "source.hpp"
#include <execinfo.h>
#include <unistd.h>
Source::Source(std::ifstream& reader_ref) : m_reader_ref(reader_ref) {}
请注意,代码已被严重截断,并且项目中还有更多文件,但它们都可以正常编译,并且在我包含 pascalWordToken 接口之前不会出现错误......
【问题讨论】:
-
帖子的最后一行很明显。
-
所有的反斜杠是怎么回事?
-
当我编辑代码以获得更好的格式时,我不知道如何处理反斜杠,所以我离开了它们。如果它们不在实际代码中,那么您应该编辑您的问题以删除它们。同时请出示您的
source.hpp文件。 -
确保
source.hpp不包括token.hpp、pascalWordToken.hpp或pascalToken.hpp -
那么你可能在你拥有的所有头文件的至少一个中的某个地方有一个循环依赖。这就是我个人避免在其他头文件中包含头文件的原因,除非绝对需要,而是尽可能使用前向声明。
标签: c++ inheritance compiler-errors