学校の課題に取り組んでいる間、演算子のオーバーロードとテンプレートで何かをしなければなりませんでした。すべてクール。私が書いた:
template<class T>
class Multiplication : public Expression<T>
{
private:
typename std::shared_ptr<Expression<T> > l, r;
public:
Multiplication(typename std::shared_ptr<Expression<T> > l, typename std::shared_ptr<Expression<T> > r) : l(l), r(r) {};
virtual ~Multiplication() {};
T evaluate() const
{
std::cout << "*";
T ml = l->evaluate();
T mr = r->evaluate();
return ml * mr;
};
};
次に、友人が、彼のコードが「間違った」順序で出力を生成した理由を尋ねました。彼は次のようなものを持っていました
T evaluate() const
{
std::cout << "*";
return l->evaluate() * r->evaluate();
};
のコードはr->evaluate()
、 の前にデバッグ情報を出力しl->evaluate()
ました。これらの 3 行をワンライナーに変更するだけで、自分のマシンでもテストしました。
*
それで、それなら右から左への結合であるべきだと思いました。しかし、インターネット上のどこでも、彼らはそれが左から右であると言います. 追加のルールはありますか?テンプレートを使用する際に何か特別なことがありますか? または、これは VS2012 のバグですか?