小编And*_*rew的帖子

为什么静态数据成员可能无法初始化?

我正在尝试在加载时注册一堆类的工厂.我的策略是利用静态初始化来确保在main()开始之前,工厂已准备就绪.当我动态链接我的库时,这个策略似乎有效,但是当我静态链接时,这种策略似乎没有用.当我静态链接时,只有一些静态数据成员被初始化.

让我们说我的工厂建造汽车.我有CarCreator类可以实例化一些汽车,但不是全部.我希望工厂收集所有这些CarCreator类,以便寻找新车的代码可以去工厂而不必知道谁将进行实际构造.

所以我有

CarTypes.hpp

enum CarTypes
{
   prius = 0,
   miata,
   hooptie,
   n_car_types
};
Run Code Online (Sandbox Code Playgroud)

MyFactory.hpp

class CarCreator
{
public:
   virtual Car * create_a_car( CarType ) = 0;
   virtual std::list< CarTypes > list_cars_I_create() = 0;
};

class MyFactory // makes cars
{
public:
   Car * create_car( CarType type );
   void factory_register( CarCreator * )

   static MyFactory * get_instance(); // singleton
private:
   MyFactory();

   std::vector< CarCreator * > car_creator_map;
};
Run Code Online (Sandbox Code Playgroud)

MyFactory.cpp

MyFactory:: MyFactory() : car_creator_map( n_car_types );

MyFactory * MyFactory::get_instance() {
   static MyFactory …
Run Code Online (Sandbox Code Playgroud)

c++ initialization static-members

6
推荐指数
1
解决办法
4448
查看次数

GCC 向依赖默认构造函数的模板化类中的静态数据成员提供“未定义引用”错误

我有一个与此类似的问题:

静态字段模板特化的“未定义引用”

但他们使用的解决方法对我不起作用。

我有一个带有静态数据成员的 CRTP 类,其中一个是 std::mutex。不幸的是,GCC 的 (4.8.2) 链接器给了我这个互斥锁的“未定义引用”错误。Clang (3.4) 没有。有解决方法吗?最初的问题(上面链接)在静态数据成员上调用了复制构造函数,迫使 GCC 发出一个符号,但由于我的数据成员是 std::mutex,这不是一个选项——复制构造函数被删除,然后没有参数构造函数。我只是被冲洗了吗?

我不相信问题出在 std::mutex 上,我认为问题在于 GCC 如何处理依赖默认构造函数的模板类中的静态数据成员。

谢谢你的帮助!

这是我的问题的精简版:test.hh

#include <mutex>

template < class T >
class CRTP_class {
public:
  T * ptr_;
  static std::mutex mutex_; // linker error here
  static int clearly_a_problem_with_mutex_; // no linker error here
};

class Foo : public CRTP_class< Foo >
{
public:
  void set_bar( int setting );
  int bar_;
};
Run Code Online (Sandbox Code Playgroud)

测试.cc

#include <test.hh>

template<> std::mutex CRTP_class< Foo >::mutex_;
template<> int CRTP_class< …
Run Code Online (Sandbox Code Playgroud)

c++ gcc templates static-members c++11

5
推荐指数
1
解决办法
1357
查看次数

标签 统计

c++ ×2

static-members ×2

c++11 ×1

gcc ×1

initialization ×1

templates ×1