0

我有一个Parser.h, 定义了一个 struct StmtParent

...
struct StmtParent;

class Parser {
...

然后在Parser.cpp

struct StmtParent {
    int stmtNo;
    int parent;
};
... 

好像没事吧?然后我有一个单元测试(cppunit):

# in ParserUnitTests.h
#include "header\Parser.h"

# in ParserUnitTests.cpp
void ParserUnitTests::testParseProcSideEffects() {
...
stack<StmtParent> follows;
    ...

然后我收到如下错误:

error C2027: use of undefined type 'StmtParent'

为什么,我可以使用像Parser::parseLine(). 为什么我不能访问结构?所以我尝试包含Parser.hParserUnitTests.cpp(尽管我已经将它包含在标题中)。然后我得到:

Error   8   error C2146: syntax error : missing ';' before identifier 'm_cCurToken' c:\program files (x86)\microsoft sdks\windows\v7.0a\include\parser.h    52
Error   9   error C4430: missing type specifier - int assumed. Note: C++ does not support default-int   c:\program files (x86)\microsoft sdks\windows\v7.0a\include\parser.h    52
Error   10  error C4430: missing type specifier - int assumed. Note: C++ does not support default-int   c:\program files (x86)\microsoft sdks\windows\v7.0a\include\parser.h    52
...
4

1 回答 1

2

Parser.h没有定义结构,它前向声明它。因此,当您尝试将其用作 的模板参数时,它是不完整的stack,并且您不能将不完整的类型用作 STL 容器的参数:

C++11 草案 3035, 17.4.3.6, 第 2 段:

特别是,在以下情况下效果是不确定的:

...

如果在实例化模板组件时将不完整的类型 (3.9) 用作模板参数,除非该组件特别允许。

您可以检查一下以进行推理。

于 2012-11-05T02:14:23.310 回答