C ++: нужен правильный синтаксис, чтобы избежать предупреждения MISRA 14-6-1. Шаблон класса с зависимым базовым классом - PullRequest
0 голосов
/ 02 сентября 2018

Я написал лексер / парсер для языка под названием 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

1 Ответ

0 голосов
/ 02 сентября 2018

Это немного глупо, поскольку неквалифицированные имена (не используемые при доступе к членам класса) вообще не ищутся в зависимых базах . Поэтому нет возможности (скажем) неправильно сформированного отчета о недопустимости интерпретации по специализации, отличающейся от интерпретации в определении.

В любом случае, руководство хочет, чтобы вы написали

SmlPrimitiveWithValue(void) : ::SmlPrimitive<tokenType, tokenLength>(), value() {};

(с любым пространством имен, содержащим SmlPrimitive, если есть). То есть назвать базовый класс с квалифицированным идентификатором .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...