2017-08-01 90 views
0

我无法调用单例类的成员函数。我有以下C++:调用单例方法会导致“函数声明器之后的预期函数体”

// 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; 
    } 
}; 

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

singleton::instance().get(); 

int main() {} 

我发现移动调用主内一切工作正常。我还发现,存储的主要之外的结果也能正常工作,像这样

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

int main() {} 

我想什么明白的是为什么称它的外面的main()失败,如果有那并不是一种解决方法t需要存储结果。谢谢。

+0

为什么downvote? – linuxfever

+1

我没有downvote,但你的问题很混乱,因为它与单身无关,而是关于函数或声明之外的声明。 – stefaanv

+0

为什么你认为你应该打电话,而你不打算使用的价值? – 2017-08-01 11:15:27

回答

0

首先,这与单身人士没有任何关系。

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

0

C++标准说:

3.5程序和连杆1的程序由链接在一起的一个或多个转换单元(第2条)。翻译单元 由声明的序列组成。

这条线:

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

是变量声明,但此行

singleton::instance().get();

被调用方法instanceget,和编译器会将其作为函数声明已经宣布。