у меня есть Parser.h
, который определяет структуру 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
...
Parser.h
не определяет структуру, она ее объявляет Поэтому, когда вы пытаетесь использовать его в качестве параметра шаблона для stack
и вы не можете использовать неполные типы в качестве параметров для контейнеров STL:
C ++ 11, проект 3035, 17.4.3.6, пункт 2:
В частности, эффекты не определены в следующих случаях:
…
если неполный тип (3.9) используется в качестве аргумента шаблона при создании экземпляра компонента шаблона,
если специально не разрешено для этого компонента.
Ты можешь проверить этот вне для рассуждений.
Других решений пока нет …