如何使静态类函数返回非const引用

时间:2015-08-03 16:36:28

标签: c++

问题:如何从静态类函数返回非常量引用,为什么下面的代码没有这样做?

我正在尝试初始化带有custom allocator的向量,这些向量本身是通过引用自定义内存管理类来初始化的。这是看起来像:

自定义std :: vector allocator参考自定义内存管理类初始化

template <class T, std::size_t N, std::size_t MAX_SIZE, int ID>
class short_alloc
{
  arena<N, MAX_SIZE, ID>& a_;    //this is the custom memory  mgmt class
... 
public:
  short_alloc(arena<N, MAX_SIZE, ID>& a) noexcept : a_(a) { 
  std::cout<< "copying from reference" << std::endl;
  }

但是,我希望每个模板类型只有1个内存管理器,因此我尝试使用单例的GetInstance()方法初始化分配器,以便每个模板类型只创建1个内存管理器:

Singleton类,确保每组模板参数只有1个内存管理器

template <typename T>
class Singleton
{
 public:
    static T* m_instance;
    static T& GetInstance(){
    if(!m_instance){
      m_instance = new T();
    }
    return m_instance;  
  };
};

使用案例

我使用自定义分配器/内存管理器类实例化向量,如下所示:

template <class T, std::size_t N, std::size_t MAX_SIZE, int ID>
class SmallVector {
   public:
      std::vector<T, short_alloc<T, N, MAX_SIZE, 1>> vec;
      SmallVector() : vec(Singleton<arena<N, MAX_SIZE, ID>>::GetInstance()){ 
      std::cout << "running constructor" << std::endl;
      }
   ...
  }

并在int main()中调用,如此:

SmallVector<int, MAX_BLOCK, MAX_INDIV, 1> s;

但是,这会产生编译器错误:

error: invalid initialization of non-const reference of type 'arena<3200ul, 400ul, 1>& from an rvalue of type 'arena<3200ul, 400ul, 1>*' return &m_instance;

所以好像我的Singleton类正在返回一个const引用/ r-type引用。我怎样才能返回l-type引用?

1 个答案:

答案 0 :(得分:4)

返回类型为Singleton&。但是,在return语句中,您正在使用

return m_instance;  

那应该是

return *m_instance;  

您可以使用以下方法简化课程:

template <typename T>
class Singleton
{
 public:
   static T& GetInstance(){

      // By using a static variable, its initialization is 
      // thread-safe, per C++11. That's another reason to
      // prefer this method.
      static T m_instance;

      return m_instance;  
   }
};