質問するログイン新規登録

質問編集履歴

3

追記

2016/10/25 08:24

投稿

katahiromz
katahiromz

スコア186

title CHANGED
File without changes
body CHANGED
@@ -8,4 +8,94 @@
8
8
 
9
9
  ![イメージ説明](c6f153d6ac0c9a6ffd4147e6e1c5076d.gif)
10
10
 
11
- 画像は、chronoのサンプルをコンパイルしたところです。修正方法を教えて下さい。よろしくお願い致します。
11
+ 画像は、chronoのサンプルをコンパイルしたところです。修正方法を教えて下さい。よろしくお願い致します。
12
+
13
+ (追記)
14
+ 現在のサンプルのchrono.cppは、実質的に次のコードと同じです。
15
+
16
+ ```C++
17
+ #define UNBOOST_USE_CHRONO
18
+ #include <unboost.hpp>
19
+ int main(void) {
20
+ using namespace unboost::chrono;
21
+ std::cout << "chrono" << std::endl;
22
+ {
23
+ std::cout << "MMMM" << std::endl;
24
+ seconds s = hours(1) + minutes(1);
25
+ }
26
+ std::cout << "success" << std::endl;
27
+
28
+ return 0;
29
+ }
30
+ ```
31
+
32
+ 出力を除けば、主な処理は、
33
+ ```C++
34
+ seconds s = hours(1) + minutes(1);
35
+ ```
36
+ の一行になります。
37
+
38
+ hoursは、
39
+ ```C++
40
+ unboost::chrono::duration<_int64_t, unboost::ratio<3600, 1> >
41
+ ```
42
+ と同じであり、これは1時間という時間の量を表し、
43
+ ```C++
44
+ std::chrono::duration<long long, std::ratio<3600, 1>>
45
+ ```
46
+ と同じように動作することを期待しています。
47
+ unboost::ratioは、コンパイル時の有理数を定義し、std::ratioと同じように動作することを期待しています。
48
+
49
+ また、minutesは、
50
+ ```C++
51
+ unboost::chrono::duration<_int64_t, unboost::ratio<60, 1> >
52
+ ```
53
+ と同じであり、これは60秒という時間の量を表し、
54
+ ```C++
55
+ std::chrono::duration<long long, std::ratio<60, 1>>
56
+ ```
57
+ と同じように動作することを期待しています。
58
+
59
+ hours(1)は、1時間を表し、unboost/chrono.hppの394行目で初期化されます。
60
+ minutes(1)は、1分間を表し、unboost/chrono.hppの394行目で初期化されます。
61
+ これで初期化が終わります。ここまでは問題ありません。
62
+
63
+ 次に、hours(1) + minutes(1)という足し算になる訳ですが、unboost/chrono.hppの471行目の
64
+ ```C++
65
+ operator+(const unboost::chrono::duration<Rep1, Period1>&,
66
+ const unboost::chrono::duration<Rep2, Period2>&)
67
+ ```
68
+ で処理されます。これは、
69
+ ```C++
70
+ operator+(const std::chrono::duration<Rep1, Period1>&,
71
+ const std::chrono::duration<Rep2, Period2>&)
72
+ ```
73
+ と同じような動作を行うことを期待しています。
74
+ operator+(const duration&, const duration&)の中身と戻り値で、
75
+ ```C++
76
+ unboost::chrono::common_duration_type<
77
+ unboost::chrono::duration<...>,
78
+ unboost::chrono::duration<...>>
79
+ ```
80
+ という型が使われます。このunboost::chrono::common_duration_typeというのは、unboost/chrono.hppの180行目前後で定義されており、C++11の
81
+ ```C++
82
+ std::common_type<std::chrono::duration<...>, std::chrono::duration<...>>
83
+ ```
84
+ と同じ動作になることを期待しています。
85
+
86
+ しかし、エラーメッセージを見る限りでは、operator+の戻り値の型は、duration<__int64, ratio<0, 6>>になっております。unboost/chrono.hppの480行目で、CD(lhs).count()などと書かれておりますが、このCDがduration<__int64, ratio<0, 6>>になっていて、これがコンストラクタの
87
+ ```C++
88
+ template <class Rep2, class Period2>
89
+ duration(const duration<Rep2, Period2>& d) {
90
+ rep_ = duration_cast<type>(d).count();
91
+ }
92
+ ```
93
+ を引き起こし、さらにduration_castを引き起こします。duration_castは、unboost/chrono.hppの677行目前後で定義されています。そこで
94
+ ```C++
95
+ typedef ratio_divide<Period, to_period> cf;
96
+ ```
97
+ のように、ピリオドの割り算を行っておりますが、割り算の除数は非ゼロでなければなりません。
98
+ しかし、Borland 5.5.1ではto_periodがゼロになっており、そのため、論理エラーが発生し、
99
+ UNBOOST_STATIC_ASSERT_MSGの失敗を引き起こします。
100
+
101
+ これが問題な訳です。回避方法などがございませんか?

2

タイトルを編集

2016/10/25 08:24

投稿

katahiromz
katahiromz

スコア186

title CHANGED
@@ -1,1 +1,1 @@
1
- テンプレートがうまく動かない
1
+ C++のテンプレートがうまく動かない
body CHANGED
File without changes

1

ごみを削除

2016/10/25 01:52

投稿

katahiromz
katahiromz

スコア186

title CHANGED
File without changes
body CHANGED
@@ -6,6 +6,6 @@
6
6
 
7
7
  Unboostのchronoという、時間に関するモジュールですが、これがBorland C++ 5.5.1でうまく動かなくて困っています。
8
8
 
9
- ![イメージ説明](c6f153d6ac0c9a6ffd4147e6e1c5076d.gif)](3b1d59553db417605998da3d654b678f.gif)
9
+ ![イメージ説明](c6f153d6ac0c9a6ffd4147e6e1c5076d.gif)
10
10
 
11
11
  画像は、chronoのサンプルをコンパイルしたところです。修正方法を教えて下さい。よろしくお願い致します。