c++单例,奇怪的错误

标签 c++ c++11

<分区>

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

比较两个代码。代码一:

#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;
            ^

在我看来,唯一的区别是私有(private)构造函数分别有一个参数和零个参数。

我怎样才能帮助编译器理解我没有定义任何新东西,而只是调用构造函数?当只有一个参数时,编译器能够理解它。

最佳答案

去掉括号

static DataLocation instance; 

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

或者,使用花括号形式的初始化。

static DataLocation instance {};

关于c++单例,奇怪的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37250951/

相关文章:

c++ - 函数栈是否保存返回地址?

C++ - 将 long 转换为 float 或 double 四舍五入值

c++11 - 为什么 std::back_inserter 迭代器在范围 3 中不是弱增量的?

c++ - 通过 ENUM 查找返回元组值(不同类型)的模板函数

c++ - 结构名称不隐藏变量名称

c++ - 如何使用divides和for_each?

c++ - 为什么 tuple_size 是特征而不是成员

c++ - 为什么我可以使用错误的参数成功地 std::bind?

c++ - 我应该如何最好地从 OS X 上的 svn 安装和使用 libc++

c++ - <functional> 中奇怪的模板语法