C++:调用单例方法会导致“函数声明器之后的预期函数体”
问题描述:
我无法调用单例类的成员函数。我有以下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需要存储结果。谢谢。
答
首先,这与单身人士没有任何关系。
main
是程序的入口。在main之前编译器做的是一些声明:变量,函数,类。 auto v = singleton::instance().get();
没问题,它是全局变量的声明。显然,编译器将singleton::instance().get();
作为函数的声明,但事实上并非如此。
答
C++标准说:
3.5程序和连杆1的程序由链接在一起的一个或多个转换单元(第2条)。翻译单元 由声明的序列组成。
这条线:
auto v = singleton::instance().get();
是变量声明,但此行
singleton::instance().get();
被调用方法instance
和get
,和编译器会将其作为函数声明已经宣布。
为什么downvote? – linuxfever
我没有downvote,但你的问题很混乱,因为它与单身无关,而是关于函数或声明之外的声明。 – stefaanv
为什么你认为你应该打电话,而你不打算使用的价值? – 2017-08-01 11:15:27