【发布时间】:2014-07-28 22:12:59
【问题描述】:
我正在学习 C++11 中的 ratio。根据cplusplus.com 和Professional C++ 2nd 一书(以下段落是其中的摘录)。
有理数的分子和分母表示为
std::intmax_t类型的编译时间常数。因为编译 这些有理数的时间性质,使用它们可能看起来有点 复杂且与平常不同。您不能定义比率对象 与定义普通对象的方式相同,并且不能调用方法 在上面。您需要使用typedefs。
这意味着我必须写
typedef ratio<1,3> one_third;
而不是
ratio<1,3> one_third;
但我发现这两种写入比率的方式都有效。我可以使用. 或:: 访问比率成员。
问题一、cplusplus.com和Professional C++书错了吗?
以下 sn-p 来自 cplusplus.com 示例。
typedef std::ratio<1,3> one_third;
typedef std::ratio<2,4> two_fourths;
typedef std::ratio_add<one_third,two_fourths> sum;
std::cout << sum::den << std::endl;
问题 2。但是,我遇到了一个错误(使用 VS 2012)
error C2039: 'den' : is not a member of 'std::ratio_add<_R1,_R2>'
根据 cmets,使用typedef ratio_add<one_third, two_fourths>::type sum 更便携。
【问题讨论】:
-
我认为你想使用
#define而不是typedef。 -
@Havenard 我看不出
#define在这方面有什么优势,而且通常的缺点是众所周知的,我希望我不需要在这里提及它们。为什么你认为#define会更好? -
代码很好,也许你的标准库实现不是。见ideone.com/4nKryf
-
@champaign 这是 VS2012 bug,因为该版本不支持别名模板。已在 VS2013 中修复。