在完成学校作业时,我们不得不对运算符重载和模板做一些事情。都很酷。我写:
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()
。我也在我的机器上对其进行了测试,只需将这三行更改为单行即可。
所以,我想,那么*
应该是从右到左的联想。但是互联网上到处都说它是从左到右的。有一些额外的规则吗?使用模板时可能有什么特别之处?还是这是 VS2012 中的错误?