C++ 如何在类';谁的头文件?

C++ 如何在类';谁的头文件?,c++,constants,static-members,compile-time-constant,C++,Constants,Static Members,Compile Time Constant,在我的类的头文件中,我尝试了以下操作并收到了编译器的投诉: private: static const double some_double= 1.0; 您应该如何实际执行此操作?在头中声明它,并在一个编译单元中初始化它(类的.cpp是合理的) 在C++11中,由于constexpr,可以使用非整数常量表达式: private: static constexpr double some_double = 1.0; 我通过以下方式解决了这个问题: //my_class.hpp

在我的类的头文件中,我尝试了以下操作并收到了编译器的投诉:

private:
    static const double some_double= 1.0;

您应该如何实际执行此操作?

在头中声明它,并在一个编译单元中初始化它(类的.cpp是合理的)


在C++11中,由于
constexpr
,可以使用非整数常量表达式:

private:
    static constexpr double some_double = 1.0;

我通过以下方式解决了这个问题:

//my_class.hpp
const double my_double() const {return 0.12345;}

//in use
double some_double = my_class::my_double();
我是从你那里得到这个主意的

math::pi()

我想你不能把它放在头文件里。这将打破只定义一次常量的规则。根据这一点,andser on SO:·如果你想完全在标题中完成(如问题所示),那么有两种主要方法。第一个也是最简单的方法是定义一个内联函数来生成该值,或者定义一个对该值的引用。第二种方法是使用模板常量技巧,如图所示。我认为模板化的常量技巧是我的,因为除了几年前发生的一个例外,我是我所知道的唯一一个提倡和/或讨论它的人。但是,如果您不喜欢这两种解决方案,那么只需单独编译即可。Cheers&hth.,修正案:我不知道C++11
constexpr
可以用KerrekSB的答案中所示的方式使用,所以现在这是第三种方式了。:-)@Cheers and Hth.-Alf
constexpr
如果您想要静态成员的引用(这在传递给将param作为const ref的函数时可能是必需的)——但是,如果您想要
constexpr
并将其保留在头中并能够引用它,我猜您的伪模板技巧是什么(如果我理解正确,这只是解决ODR问题的一种方法)只需添加一个
constexpr
就可以了…(比如这里:)如果这是答案,那么这是一个重复的问题。
const double my_double()
Hug?为什么
const
const
对函数返回的值执行操作确实毫无意义,但除此之外,在
constepr
存在之前,这是一个可靠的选项。这不仅仅是令人困惑的!那
constepr
不能做什么?如果允许
constepr
,为什么LND<代码> const <代码>暗示C++ >打破了自己的历史设计。<代码> const <代码>并不意味着<代码> conXPRPR < /C> >代码>暗示代码> const 。<代码> conxPRP比 > const >更严格。考虑<代码> const AutoStuts= CcOrth.();,
seed
是一个常量变量(其值以后将无法更改),但它不是一个常量表达式(如果它是itegral,则无法用于调整数组大小).
constepr
设计用于表示编译时和运行时确定之间的区别,其中
const
更像是一个接口和/或访问权限说明符。@John:这大致正确,但比这更微妙:
constepr
成员函数不应该自动为
const
,但s仅在C++14中得到修复。这不一定有效,请参见:@Eloff:这不是矛盾。如果您使用odr变量,则必须定义它,但这并不阻止您使用常量表达式。
math::pi()