こんにちは、コンピュータ研究家の片山博文MZです。現在、Unboostというライブラリを作っています。Unboostは、C++11やBoostをまねたもので、C++03でC++11相当の機能を実現するために作っています。
https://github.com/katahiromz/unboost
https://github.com/katahiromz/unboost/blob/master/unboost/chrono.hpp
https://github.com/katahiromz/unboost/blob/master/samples/chrono.cpp
Unboostのchronoという、時間に関するモジュールですが、これがBorland C++ 5.5.1でうまく動かなくて困っています。
画像は、chronoのサンプルをコンパイルしたところです。修正方法を教えて下さい。よろしくお願い致します。
(追記)
現在のサンプルのchrono.cppは、実質的に次のコードと同じです。
C++
1#define UNBOOST_USE_CHRONO 2#include <unboost.hpp> 3int main(void) { 4 using namespace unboost::chrono; 5 std::cout << "chrono" << std::endl; 6 { 7 std::cout << "MMMM" << std::endl; 8 seconds s = hours(1) + minutes(1); 9 } 10 std::cout << "success" << std::endl; 11 12 return 0; 13}
出力を除けば、主な処理は、
C++
1 seconds s = hours(1) + minutes(1);
の一行になります。
hoursは、
C++
1 unboost::chrono::duration<_int64_t, unboost::ratio<3600, 1> >
と同じであり、これは1時間という時間の量を表し、
C++
1 std::chrono::duration<long long, std::ratio<3600, 1>>
と同じように動作することを期待しています。
unboost::ratioは、コンパイル時の有理数を定義し、std::ratioと同じように動作することを期待しています。
また、minutesは、
C++
1 unboost::chrono::duration<_int64_t, unboost::ratio<60, 1> >
と同じであり、これは60秒という時間の量を表し、
C++
1 std::chrono::duration<long long, std::ratio<60, 1>>
と同じように動作することを期待しています。
hours(1)は、1時間を表し、unboost/chrono.hppの394行目で初期化されます。
minutes(1)は、1分間を表し、unboost/chrono.hppの394行目で初期化されます。
これで初期化が終わります。ここまでは問題ありません。
次に、hours(1) + minutes(1)という足し算になる訳ですが、unboost/chrono.hppの471行目の
C++
1operator+(const unboost::chrono::duration<Rep1, Period1>&, 2 const unboost::chrono::duration<Rep2, Period2>&)
で処理されます。これは、
C++
1operator+(const std::chrono::duration<Rep1, Period1>&, 2 const std::chrono::duration<Rep2, Period2>&)
と同じような動作を行うことを期待しています。
operator+(const duration&, const duration&)の中身と戻り値で、
C++
1 unboost::chrono::common_duration_type< 2 unboost::chrono::duration<...>, 3 unboost::chrono::duration<...>>
という型が使われます。このunboost::chrono::common_duration_typeというのは、unboost/chrono.hppの180行目前後で定義されており、C++11の
C++
1std::common_type<std::chrono::duration<...>, std::chrono::duration<...>>
と同じ動作になることを期待しています。
しかし、エラーメッセージを見る限りでは、operator+の戻り値の型は、duration<__int64, ratio<0, 6>>になっております。unboost/chrono.hppの480行目で、CD(lhs).count()などと書かれておりますが、このCDがduration<__int64, ratio<0, 6>>になっていて、これがコンストラクタの
C++
1 template <class Rep2, class Period2> 2 duration(const duration<Rep2, Period2>& d) { 3 rep_ = duration_cast<type>(d).count(); 4 }
を引き起こし、さらにduration_castを引き起こします。duration_castは、unboost/chrono.hppの677行目前後で定義されています。そこで
C++
1 typedef ratio_divide<Period, to_period> cf;
のように、ピリオドの割り算を行っておりますが、割り算の除数は非ゼロでなければなりません。
しかし、Borland 5.5.1ではto_periodがゼロになっており、そのため、論理エラーが発生し、
UNBOOST_STATIC_ASSERT_MSGの失敗を引き起こします。
これが問題な訳です。回避方法などがございませんか?
回答3件
あなたの回答
tips
プレビュー