c++:需要正确的语法以避免 MISRA 14-6-1 警告.具有依赖基类的类模板
c++: Need correct syntax to avoid MISRA 14-6-1 warning. Class template with dependent base class
我已经为一种名为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命名基类。
相关文章:
- 警告处理为错误这里有什么问题
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 枚举环境变量的惯用C++14/C++17方法
- cppcheck在const std::string[]上引发警告
- GCC对可能有效的代码抛出init list生存期警告
- 如何在BST的这个简单递归实现中消除警告
- 关于std::move的使用,是否有编译警告
- g++ 在某个类成员未初始化时不发出警告
- 如何处理来自核心指南检查器的关于gsl::at的静态分析警告
- 使用typeid警告未使用的变量
- 示例C++项目编译中的警告
- 警告:在函数返回类型 [-Wignore 限定符] 时忽略类型限定符
- 如何修复编译器警告 C6386 和 C6385?
- 返回语句后的代码,没有警告
- 获取隐式转换溢出从无符号到已签名的警告
- c++:需要正确的语法以避免 MISRA 14-6-1 警告.具有依赖基类的类模板
- STM32 HAL 库警告,含 C++14 及以上
- NS3 - G++ 6.x 有关 c++14 的警告
- C 14警告:太多的变量模板标头(应该为0)
- OS X 优胜美地中的 gcc 4.9.1 - gcc:警告:无法理解 kern.osversion '14.0.0'