静态变量与模板类的冲突声明

时间:2017-03-01 14:15:24

标签: c++ c++11 templates gcc clang

我尝试在类范围之外定义一个静态变量,如:

template<typename T>
struct Foo {
  void set(int i)  {
  }
  static constexpr decltype(&Foo<T>::set) i = &Foo<T>::set;
};

template<typename T>
constexpr decltype(&Foo<T>::set) Foo<T>::i;

Live example.

但我得到以下错误(对于所有gcc&gt; = 4.7):

conflicting declaration 'constexpr decltype (& Foo<T>::set(int))   Foo<T>::i'
note: previous declaration as 'constexpr decltype (& Foo<T>::set(int)) Foo<T>::i'

所有clang版本(clang&gt; = 3.2)对我的代码没有任何问题。

问题似乎是功能参考。它可以在不使用模板类的情况下工作。

我的问题:

  • 这是一个错误吗?
  • 如何在gcc中完成?

1 个答案:

答案 0 :(得分:1)

我不知道这是不是一个错误,但你可以这样做:

template<typename T>
struct Foo {
  void set(int i)  {
  }

  typedef decltype(&Foo<T>::set) function_type;
  static constexpr function_type i = &Foo<T>::set;
};

template<typename T>
constexpr typename Foo<T>::function_type Foo<T>::i;

int main()
{
  Foo<int> f;
}