トップページ > プログラム > 2014年03月23日 > sV6DQ8Cb

書き込み順位&時間帯一覧

12 位/224 ID中時間01234567891011121314151617181920212223Total
書き込み数0000000000020000000001317



使用した名前一覧書き込んだスレッド一覧
デフォルトの名無しさん
C++14/C++1y
プログラミング雑談スレ♯+

書き込みレス一覧

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細胞みたいに
なっちまった。寝る。


※このページは、『2ちゃんねる』の書き込みを基に自動生成したものです。オリジナルはリンク先の2ちゃんねるの書き込みです。
※このサイトでオリジナルの書き込みについては対応できません。
※何か問題のある場合はメールをしてください。対応します。