c++:需要正确的语法以避免 MISRA 14-6-1 警告.具有依赖基类的类模板

c++: Need correct syntax to avoid MISRA 14-6-1 warning. Class template with dependent base class

本文关键字:警告 14-6-1 依赖 基类 MISRA 语法 c++      更新时间:2023-10-16

我已经为一种名为SML的语言编写了一个词法分析器/解析器。它用于电子仪表。我正处于静态代码分析阶段。Lint 报告了 MISRA 违规行为 14-6-1。规则(必需(是:"在具有依赖基的类模板中,在该依赖基数中可能找到的任何名称都应使用限定 id 或 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 规则的正确语法是什么?

我嘟嘟囔囔地试了又试,但想不出解决方案。

编辑:

我也试过:

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

这有点愚蠢,因为根本不会在依赖基中查找非限定名称(未在类成员访问中使用(。 因此,在与定义不同的专业化解释中,不存在(例如(格式错误的 NDR。

无论如何,指南想要的是让你写

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

(使用任何命名空间包含SmlPrimitive,如果有的话(。 也就是说,使用限定 id命名基类。