MISRA C ++规则14-5-1:在与类型相关联的名称空间中声明的通用函数模板的名称

时间:2017-10-31 16:08:37

标签: c++ misra

警告1573(“与名称相关联的名称空间中声明的泛型函数模板的名称”)在命名空间为时非常相关 匿名命名空间?我用于测试的大多数辅助函数都在未命名的命名空间中,它违反了上述规则。

示例:

namespace
{
  template <typename T>
  T template_func(T arg)
  {
    return arg;
  }

  class foo {};
}

int main()
{
  return template_func(0);
}

如何解决上述问题,以满足规则?

2 个答案:

答案 0 :(得分:2)

作为示例中的状态,您可以使用额外的命名空间,例如:

namespace
{
    template< class T >
    T template_func(T arg) { return arg; }

    namespace X
    {
        class foo{};
    }
    using X::foo;
}

int main()
{
    return template_func(0);
}

答案 1 :(得分:1)

我猜它并不是为了污染全局命名空间,而是为了避免类别从属于同一命名空间的通用模板中获取奇怪的匹配。

它遵循cpp核心准则T.47: Avoid highly visible unconstrained templates with common names

具体做法是:

  

原因:   无约束的模板参数是任何事物的完美匹配,因此这种模板可以优先于需要轻微转换的更具体类型。当使用ADL时,这尤其令人讨厌/危险。通用名称更有可能使这个问题发生。

     

注意:   如果在与类型相同的命名空间中定义了无约束模板,则ADL可以找到该无约束模板(如示例中所示)。也就是说,它非常醒目。

关于如何绕过它,Jarod42在他的answer中以第一名为榜样。