c ++单例,奇怪的错误

时间:2016-05-16 09:44:44

标签: c++ c++11

我实现了一个线程安全的单例。但是这方面(单身和线程安全)不是我的问题的一部分。

比较两个代码。代码1:

#include <iostream>
using namespace std;
class DataLocation {
private:
  DataLocation(std::string) {
  }
public:
  DataLocation& getInstance() {
    std::string s = " ";
    static DataLocation instance(s);
    return instance;
  }
};
int main() {
}

和代码2:

#include <iostream>
using namespace std;
class DataLocation {
private:
  DataLocation() {
  }
public:
  DataLocation& getInstance() {
    static DataLocation instance();    
    return instance;
  }
};
int main() {
}

代码1编译好。代码2给出以下错误:

15_singleton.cpp: In member function ‘DataLocation& DataLocation::getInstance()’:
15_singleton.cpp:15:34: error: cannot declare static function inside another function
     static DataLocation instance();    
                                  ^
15_singleton.cpp:16:12: error: invalid initialization of non-const reference of type ‘DataLocation&’ from an rvalue of type ‘DataLocation (*)()’
     return instance;
            ^

从我的观点来看,唯一的区别是私有构造函数有一个零参数。

我如何帮助编译器理解我没有定义任何新内容,但我只是调用构造函数?当有一个参数时,编译器能够理解它。

4 个答案:

答案 0 :(得分:5)

删除括号

static DataLocation instance; 

使用默认构造函数创建实例。

或者,使用支撑形式的初始化。

static DataLocation instance {};

答案 1 :(得分:2)

static DataLocation instance = DataLocation(); 

static DataLocation instance;

您可能希望将DataLocation& getInstance();声明为static方法。

答案 2 :(得分:2)

在声明

时使用括号()
static DataLocation instance(); 

您打算将其创建为对象。但是,只是一个函数声明。并且您无法在其他非static函数中创建static函数。这就是你的错误所指的。

答案 3 :(得分:1)

方法getInstance()应声明为静态。