问题:如何从静态类函数返回非常量引用,为什么下面的代码没有这样做?
我正在尝试初始化带有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引用?
答案 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;
}
};