C ++:调用单例方法会导致“函数声明符之后的预期函数体”

时间:2017-08-01 11:04:21

标签: c++ singleton

我无法调用单例类的成员函数。我有以下

// my_class.hpp

class my_class {

    friend struct singleton;

    int m_x;

    my_class(int x)
    : m_x(x) {}

    // other private constructors here

public:

    const auto& get() const {
        return m_x;
    }
};


struct singleton {

    static auto& instance() {
        static my_class x(42);
        return x;
    }
};

当试图在main()之外调用singleton::instance().get()时,编译器会说“函数声明符之后的预期函数体”。这是相关的主文件:

singleton::instance().get();

int main() {}

我发现在主要内部移动呼叫一切正常。我还发现将结果存储在main之外也可以正常工作,如此

auto v = singleton::instance().get();

int main() {}

我想了解的是为什么在main()之外调用它会失败,如果有一个解决方法不需要存储结果。谢谢。

2 个答案:

答案 0 :(得分:0)

C ++标准说:

  

3.5程序和链接1程序由一个或多个链接在一起的翻译单元(第2章)组成。翻译单位   由一系列声明组成。

这一行:

auto v = singleton::instance().get();

是变量的声明,但这一行

singleton::instance().get();

调用方法instanceget,编译器将其视为已声明的函数声明。

答案 1 :(得分:0)

首先,它与单身人士无关。

main是该计划的入口。编译器在main之前做的是一些声明:变量,函数,类。 auto v = singleton::instance().get();很好,它是全局变量的声明。显然,编译器将singleton::instance().get();作为函数的声明,但实际上并非如此。