- C++14/C++1y
717 :デフォルトの名無しさん[]:2014/03/23(日) 11:36:21.59 ID:sV6DQ8Cb - template <class T1, class T2>
auto operator + (T1 x, T2 y) -> decltype(x+y) { return x+y; } 上のところで、 error: template instantiation depth exceeds maximum of 900・・・ recursively required by substitution of 'template<class T1, class T2> decltype ((x + y)) operator+(T1, T2) [with T1 = std::complex<double>; T2 = double] みたいなエラーがでます(gcc4.8.1)。これって、decltype(x+y)のところで、operator+が再帰的に呼ばれているということですか?
|
- C++14/C++1y
719 :デフォルトの名無しさん[]:2014/03/23(日) 11:46:12.34 ID:sV6DQ8Cb - まあ、auto, decltypeの練習で試しにやってみたんですけど。
|
- C++14/C++1y
726 :デフォルトの名無しさん[]:2014/03/23(日) 21:55:13.61 ID:sV6DQ8Cb - #include <complex>
... complex<double> z(0,1); cout<<1+z<<endl; をコンパイルすると「複素数と整数の演算+は定義されていない」旨のエラーがでます。ところが template <class T> struct double_trait { typedef T type; }; template <class T> using Dtype=typename double_trait<T>::type; template <class T> std::complex<T> operator + (Dtype<T> c, const std::complex<T>& z) { return c+z; } をmain()関数の前に定義すると、今度はビルド実行できます。わからないのはintの場合の特殊化 をしてないのになぜビルド実行できるかです。 ※complex<double>とintの単純な演算子オーバーロードを使わなかったのは オペランドがchar, unsignedなどの場合にも対応させるためです。それと int iとcomplex<double> zに対して単純にreturn i+z;とするとなぜか実行時 エラーが出ます(TDM gcc4.8.1)。
|
- C++14/C++1y
727 :デフォルトの名無しさん[]:2014/03/23(日) 22:06:19.15 ID:sV6DQ8Cb - あ・・・ operator+の定義内でreturn i+z; とやるとまた再帰的にw
|
- プログラミング雑談スレ♯+
752 :デフォルトの名無しさん[]:2014/03/23(日) 22:18:10.23 ID:sV6DQ8Cb - 会社がWindows XP上で動いているソフトを使っている場合で、Windows7や
8.1へのバージョンアップをやったか、あるいはWindowsXPをサポートする サードパーティ製のセキュリティソフトを導入したかどうかを聞いてるん だろ?
|
- C++14/C++1y
728 :デフォルトの名無しさん[]:2014/03/23(日) 22:56:26.24 ID:sV6DQ8Cb - あ・・・。
template <class T> std::complex<T> operator + (Dtype<T> c, const std::complex<T>& z) は実体化される時に std::complex<double> operator + (double c, const std::complex<double>& z) となり、intやchar型の実パラメータが渡されるときに暗黙の型変換が適用されるのか? template <class T> std::complex<T> operator + (T c, const std::complex<T>& z) でもokでした。traitsは関係なしと。お騒がせしました。 今日はもう寝ます。
|
- C++14/C++1y
729 :デフォルトの名無しさん[]:2014/03/23(日) 23:05:46.93 ID:sV6DQ8Cb - あれえ?もう一回やったらokじゃない。小保方さんのSTAP細胞みたいに
なっちまった。寝る。
|