【问题标题】:C++98 template class static member initialization?C++98模板类静态成员初始化?
【发布时间】:2021-10-21 07:30:22
【问题描述】:

在一个大型 C++ 代码库中,最初是 @ 2001 编写的,一个 Singleton 类 被大量使用,定义如下:

   template <class T> 
   struct Singleton 
   { T *Instance() { return _instance; }
   ... 
     static T *_instance;
   }; 
   #define INIT_SINGLETON(T) \
    T * Singleton <T>::_instance = ((T*)0UL)

现在,使用我必须使用的 GCC 4.7.7,以及默认的 c++98 标准, 并在测试文件中使用 INIT_SINGLETON(structX),我得到:

   $ g++ -std=c++98 -c /tmp/ts.cpp 
   /tmp/ts.cpp:11: error: too few template-parameter-lists

最后在 Linux RHEL3 上使用 GCC 3.4.3 编译成功的代码 - 我正在尝试移植 它到 RHEL6 (GCC 4.4.4 / 4.7.7)。

我使用 C++98 代码已经有一段时间了,尽管我从 @ 1994 开始就使用 C++, 我今天似乎无法理解这一点。

谁能解释一下为什么会发生这个错误以及如何避免它?

应 S.M. & NathanOliver 的要求,这是 /tmp/ts.cpp:

    template <class T> 
    struct Singleton 
    { T * Instance() { return _instance; } 
      T * _instance; 
    }; 

    struct ab_s { int a, b; }; 

    typedef Singleton<ab_s> S_ab_s_t; 

    ab_s* f(S_ab_s_t sa)
    { return sa.Instance(); 
    }

    ab_s * Singleton<ab_s> :: _instance = NULL; 

GCC 4.7.7 报错:

    $ g++ -std=c++98 -Isonim/MRFP/inc -c /tmp/ts.cpp  
    /tmp/ts.cpp:15: error: too few template-parameter-lists

【问题讨论】:

  • Singleton &lt;T&gt; -> Singleton&lt;T&gt;?
  • 可能是解析问题。如果删除名称和参数之间的空格并具有T * Singleton&lt;T&gt;::_instance = 0,错误会消失吗?
  • 请发帖minimal reproducible example。你已经有了:tmp/ts.cpp:11,文件好像很小。
  • 我们无法帮助您调试与您展示的代码不同的代码。请编辑此内容以获得minimal reproducible example。
  • 如果你想对所有专业进行相同的初始化,为什么要搞乱一个宏呢?只需在类模板下定义template&lt;class T&gt; T* Singleton&lt;T&gt;::_instance = NULL;,GCC 就会对其进行排序。

标签: c++ c++98 gcc4.4


【解决方案1】:

模板专业化需要模板。

#define INIT_SINGLETON(T) \
    template<> \
    T * Singleton<T>::_instance = ((T*)0UL)

编译示例

template <class T> 
struct Singleton 
{
  T *Instance() { return _instance; }
  static T *_instance;
}; 

#define INIT_SINGLETON(T) \
  template<> \
  T * Singleton<T>::_instance = ((T*)0UL)

struct structX{};

INIT_SINGLETON(structX);

到更新的问题:

template<>
ab_s * Singleton<ab_s> :: _instance = NULL; 

【讨论】:

  • 啊!太感谢了!我已经有一段时间没有使用这个功能了。我现在想起来了。
  • gcc 肯定可以在那里提供更多信息的诊断。
  • @JVD 确实如此! — 如今(“专业化成员 'Singleton::_instance' 需要 'template' 语法”)。
猜你喜欢
  • 1970-01-01
  • 2012-02-02
  • 1970-01-01
  • 2016-03-10
  • 1970-01-01
  • 2010-10-16
  • 1970-01-01
  • 2019-05-03
  • 2011-03-14
相关资源
最近更新 更多