【问题标题】:Negative side effects of creating a typedef that redeclares a template parameter from an outer scope?创建从外部范围重新声明模板参数的 typedef 的负面影响?
【发布时间】:2014-10-16 15:04:01
【问题描述】:

有时我想从模板外部访问模板参数的类型。为此,我 typedef 参数如下:

template<typename Vector>
class SomeAlgorithm
{
public:
    typedef Vector Vector;
    // ...
}

我觉得这很方便,因为我可以在客户端代码中使用相同的名称;这是显而易见的和简单的。

template<typename A>
void ComputeSomething(const A& a)
{
    typedef typename A::Vector Vector; 
    Vector v = ... 
}

但是,ReSharper for C++ 发出警告:

typedef redeclares a template parameter from an outer scope.

对类型参数进行类型定义有什么不好的副作用吗?或者,除了使用 typedef 的另一个名称之外,还有更好的方法来实现同样的效果吗?

【问题讨论】:

  • 不确定,但是,使用同时应用于内部模板和外部模板的命名空间可以避免这个问题。

标签: c++ templates typedef


【解决方案1】:

对类型参数进行类型定义有什么不好的副作用吗?

是的,它是无效的。参数名已经是模板范围内的typedef-name,所以不能再声明一个同名的typedef。

或者除了为 typedef 使用另一个名称之外,还有更好的方法来实现同样的效果吗?

没有。为 typedef 使用另一个名称。

【讨论】:

  • 你有无效的来源吗?
  • @Wilbert: C++11 14.1/3 "A type-parameter [...] 将其 identifier 定义为 typedef-name [...] 在模板声明的范围内。”,以及 7.1.3/4 “在给定的类范围内,typedef 说明符可用于重新定义任何 class-name 在该范围内声明 也不是 typedef-name 以引用它已经引用的类型。”
  • @Wilbert:由于过于迂腐,它有点模棱两可,因为名称不一定是 类名。但至少one popular compiler 禁止它,所以如果你想要可移植性,你应该将它视为无效。
猜你喜欢
  • 2022-08-04
  • 2017-12-02
  • 2015-12-14
  • 1970-01-01
  • 2020-03-23
  • 1970-01-01
  • 1970-01-01
  • 2021-05-04
  • 1970-01-01
相关资源
最近更新 更多