Я написал лексер / парсер для языка под названием SML. Используется в электронных счетчиках. Я нахожусь в фазе статического анализа кода. Линт сообщает о нарушении MISRA 14-6-1. Правило (обязательное): «В шаблоне класса с зависимой базой любое имя, которое можно найти в этой зависимой базе, должно ссылаться на использование квалифицированного идентификатора или this ->»
Система: Raspberry PI 3B, g ++: cc версия 4.9.2 (Raspbian 4.9.2-10), PC LINT v9.0k. Язык: C ++ 98
Выдержка из кода:
class SmlElementBase
{
public:
SmlElementBase(void) {}
virtual ~SmlElementBase(void) {}
// Main "parse" pure function to be implemented / overwritten by all derived classes
virtual prCode parse(ParserContext &pc) = 0;
// Per default an SML Element is not a container
virtual boolean isContainer(void) const { return false; }
};
template<const Token::TokenType tokenType, const TokenLength TokenLength=0UL>
class SmlPrimitive : public SmlElementBase
{
public:
SmlPrimitive(void) : SmlElementBase() {}
virtual ~SmlPrimitive(void) {}
virtual prCode parse(ParserContext &pc); // Parse function (calls match function)
protected:
virtual boolean match(const Token *token); // Match token with expected type and length
};
template<typename ValueType, const Token::TokenType tokenType, const TokenLength tokenLength=0UL>
class SmlPrimitiveWithValue : public SmlPrimitive<tokenType, tokenLength>
{
public:
//lint -e{1960,915,919}
SmlPrimitiveWithValue(void) : SmlPrimitive<tokenType, tokenLength>(), value() {};
// SmlPrimitiveWithValue(void) : SmlPrimitive<tokenType, tokenLength>(), value::SmlPrimitive() {}; NO DIFFERENCE
virtual ~SmlPrimitiveWithValue(void) {}
// Parse function is inherited.
//lint -e{1925}
ValueType value; // Value will be stored here. Public because of visitor pattern
protected:
virtual ::boolean match(const ::Token *token); // Match token with expected type and length and store value
};
typedef SmlPrimitiveWithValue<u8, Token::UNSIGNED_INTEGER, 1UL> Unsigned8;
Lint сообщает следующее:
SmlPrimitiveWithValue(void) : SmlPrimitive<tokenType, tokenLength>(), value() {};
Примечание 1942: Неквалифицированное имя «SmlPrimitive» может быть неверно истолковано из-за зависимого базового класса [MISRA C ++ Правило 14-6-1]
для конструктора SmlPrimitiveWithValue.
Какой правильный синтаксис, чтобы избежать нарушения правила MISRA?
Я googeld и попробовал и попробовал, но не мог найти решение.
EDIT:
Я пробовал также:
SmlPrimitiveWithValue(void) : ::SmlPrimitive<tokenType, tokenLength>::SmlPrimitive(), value() {};
Это не компилируется. Сообщение компилятора:
/home/pidata/project/ehz/include/parser.hpp: In constructor ‘ParserInternal::SmlPrimitiveWithValue<ValueType, tokenType, tokenLength>::SmlPrimitiveWithValue()’:
/home/pidata/project/ehz/include/parser.hpp:281:50: error: expected template-name before ‘<’ token
SmlPrimitiveWithValue(void) : ::SmlPrimitive<tokenType, tokenLength>::SmlPrimitive(), value() {};
^
/home/pidata/project/ehz/include/parser.hpp:281:50: error: expected ‘{’ before ‘<’ token