質問編集履歴

3

追記

2016/10/25 08:24

投稿

katahiromz
katahiromz

スコア186

test CHANGED
File without changes
test CHANGED
@@ -19,3 +19,183 @@
19
19
 
20
20
 
21
21
  画像は、chronoのサンプルをコンパイルしたところです。修正方法を教えて下さい。よろしくお願い致します。
22
+
23
+
24
+
25
+ (追記)
26
+
27
+ 現在のサンプルのchrono.cppは、実質的に次のコードと同じです。
28
+
29
+
30
+
31
+ ```C++
32
+
33
+ #define UNBOOST_USE_CHRONO
34
+
35
+ #include <unboost.hpp>
36
+
37
+ int main(void) {
38
+
39
+ using namespace unboost::chrono;
40
+
41
+ std::cout << "chrono" << std::endl;
42
+
43
+ {
44
+
45
+ std::cout << "MMMM" << std::endl;
46
+
47
+ seconds s = hours(1) + minutes(1);
48
+
49
+ }
50
+
51
+ std::cout << "success" << std::endl;
52
+
53
+
54
+
55
+ return 0;
56
+
57
+ }
58
+
59
+ ```
60
+
61
+
62
+
63
+ 出力を除けば、主な処理は、
64
+
65
+ ```C++
66
+
67
+ seconds s = hours(1) + minutes(1);
68
+
69
+ ```
70
+
71
+ の一行になります。
72
+
73
+
74
+
75
+ hoursは、
76
+
77
+ ```C++
78
+
79
+ unboost::chrono::duration<_int64_t, unboost::ratio<3600, 1> >
80
+
81
+ ```
82
+
83
+ と同じであり、これは1時間という時間の量を表し、
84
+
85
+ ```C++
86
+
87
+ std::chrono::duration<long long, std::ratio<3600, 1>>
88
+
89
+ ```
90
+
91
+ と同じように動作することを期待しています。
92
+
93
+ unboost::ratioは、コンパイル時の有理数を定義し、std::ratioと同じように動作することを期待しています。
94
+
95
+
96
+
97
+ また、minutesは、
98
+
99
+ ```C++
100
+
101
+ unboost::chrono::duration<_int64_t, unboost::ratio<60, 1> >
102
+
103
+ ```
104
+
105
+ と同じであり、これは60秒という時間の量を表し、
106
+
107
+ ```C++
108
+
109
+ std::chrono::duration<long long, std::ratio<60, 1>>
110
+
111
+ ```
112
+
113
+ と同じように動作することを期待しています。
114
+
115
+
116
+
117
+ hours(1)は、1時間を表し、unboost/chrono.hppの394行目で初期化されます。
118
+
119
+ minutes(1)は、1分間を表し、unboost/chrono.hppの394行目で初期化されます。
120
+
121
+ これで初期化が終わります。ここまでは問題ありません。
122
+
123
+
124
+
125
+ 次に、hours(1) + minutes(1)という足し算になる訳ですが、unboost/chrono.hppの471行目の
126
+
127
+ ```C++
128
+
129
+ operator+(const unboost::chrono::duration<Rep1, Period1>&,
130
+
131
+ const unboost::chrono::duration<Rep2, Period2>&)
132
+
133
+ ```
134
+
135
+ で処理されます。これは、
136
+
137
+ ```C++
138
+
139
+ operator+(const std::chrono::duration<Rep1, Period1>&,
140
+
141
+ const std::chrono::duration<Rep2, Period2>&)
142
+
143
+ ```
144
+
145
+ と同じような動作を行うことを期待しています。
146
+
147
+ operator+(const duration&, const duration&)の中身と戻り値で、
148
+
149
+ ```C++
150
+
151
+ unboost::chrono::common_duration_type<
152
+
153
+ unboost::chrono::duration<...>,
154
+
155
+ unboost::chrono::duration<...>>
156
+
157
+ ```
158
+
159
+ という型が使われます。このunboost::chrono::common_duration_typeというのは、unboost/chrono.hppの180行目前後で定義されており、C++11の
160
+
161
+ ```C++
162
+
163
+ std::common_type<std::chrono::duration<...>, std::chrono::duration<...>>
164
+
165
+ ```
166
+
167
+ と同じ動作になることを期待しています。
168
+
169
+
170
+
171
+ しかし、エラーメッセージを見る限りでは、operator+の戻り値の型は、duration<__int64, ratio<0, 6>>になっております。unboost/chrono.hppの480行目で、CD(lhs).count()などと書かれておりますが、このCDがduration<__int64, ratio<0, 6>>になっていて、これがコンストラクタの
172
+
173
+ ```C++
174
+
175
+ template <class Rep2, class Period2>
176
+
177
+ duration(const duration<Rep2, Period2>& d) {
178
+
179
+ rep_ = duration_cast<type>(d).count();
180
+
181
+ }
182
+
183
+ ```
184
+
185
+ を引き起こし、さらにduration_castを引き起こします。duration_castは、unboost/chrono.hppの677行目前後で定義されています。そこで
186
+
187
+ ```C++
188
+
189
+ typedef ratio_divide<Period, to_period> cf;
190
+
191
+ ```
192
+
193
+ のように、ピリオドの割り算を行っておりますが、割り算の除数は非ゼロでなければなりません。
194
+
195
+ しかし、Borland 5.5.1ではto_periodがゼロになっており、そのため、論理エラーが発生し、
196
+
197
+ UNBOOST_STATIC_ASSERT_MSGの失敗を引き起こします。
198
+
199
+
200
+
201
+ これが問題な訳です。回避方法などがございませんか?

2

タイトルを編集

2016/10/25 08:24

投稿

katahiromz
katahiromz

スコア186

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

1

ごみを削除

2016/10/25 01:52

投稿

katahiromz
katahiromz

スコア186

test CHANGED
File without changes
test CHANGED
@@ -14,7 +14,7 @@
14
14
 
15
15
 
16
16
 
17
- ![イメージ説明](c6f153d6ac0c9a6ffd4147e6e1c5076d.gif)](3b1d59553db417605998da3d654b678f.gif)
17
+ ![イメージ説明](c6f153d6ac0c9a6ffd4147e6e1c5076d.gif)
18
18
 
19
19
 
20
20