From: Andrey K. <kar...@li...> - 2006-09-09 10:33:22
|
> This sounds like a bug that is easy to fix. I would describe this situation in-depth. Let's look on OpenCXX code: Ptree* ClassWalker::TranslateAssign(Ptree* exp) { using namespace PtreeUtil; Ptree *left, *left2, *right, *right2, *exp2; Environment* scope; Class* metaobject; TypeInfo type; left = First(exp); right = Third(exp); if (left->IsA(ntDotMemberExpr) || left->IsA(ntArrowMemberExpr)) { Ptree* object = First(left); Ptree* op = Second(left); Ptree* member = Third(left); Ptree* assign_op = Second(exp); Typeof(object, type); if(!Eq(op, '.')) type.Dereference(); metaobject = GetClassMetaobject(type); } ... } GetClassMetaobject() function return NULL for non template class (from first letter). It's work that: Class* ClassWalker::GetClassMetaobject(TypeInfo& tinfo) { Class* c; if(tinfo.IsClass(c)) return c; else if(tinfo.IsReferenceType()){ tinfo.Dereference(); if(tinfo.IsClass(c)) return c; } return 0; } In this code tinfo.IsClass(c) return false, because translating template class. In result GetClassMetaobject() return 0 and lookup class member type is impossible (environment is absent). See code for lookup type in first letter. > Can you describe exactly what program / command line you used ? occ-core > doesn't appear to contain (or generate) an 'occ' executable. I write own executable with main() like this: int main() { std::ifstream stream; char* filename = "simple.cpp"; stream.open(filename); ProgramFile program(stream, filename); Lex lexer(&program); ErrorLog &errorLog = TheErrorLog(); Parser parser(&lexer, errorLog); Ptree* ptree = 0; ClassWalker walker(&parser); while (parser.rProgram(ptree)) walker.Translate(ptree); } |