0

私はParser.hstruct を定義するを持っています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.hましたParserUnitTests.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 に答える