在單元管理科學規劃的背景下,我管理下面的類:鐺拒絕模板`/`運營商,但GNU C++接受它
template <class UnitName>
class Quantity
{
double value;
public:
Quantity(double val = 0) : value(val) {}
Quantity(const Quantity &) {}
Quantity & operator = (const Quantity &) { return *this; }
double get_value() const noexcept { return value; }
operator double() const noexcept { return value; }
template <class SrcUnit>
Quantity(const Quantity<SrcUnit> &)
{
// here the conversion is done
}
template <class SrcUnit>
Quantity & operator = (const Quantity<SrcUnit> &)
{
// here the conversion is done
return *this;
}
template <class TgtUnit> operator TgtUnit() const
{
TgtUnit ret;
// here the conversion is done
return ret;
}
template <class U, class Ur>
Quantity<Ur> operator/(const Quantity<U> & rhs) const
{
return Quantity<Ur>(value/rhs.value);
}
};
儘管該類要複雜得多,我想我把足夠的信息,以說明我的問題:
現在考慮下面的代碼片段:
struct km_h {};
struct Km {};
struct Hour {};
Quantity<km_h> compute_speed(const Quantity<Km> & dist,
const Quantity<Hour> & time)
{
Quantity<km_h> v = dist/time;
return v;
}
這些代碼是接受10編譯器,它運行良好。調用最後一個模板運算符/
。
但它是由clang++
編譯器(V 3.8.1)與以下消息拒絕:
test-simple.cc:53:26: error: use of overloaded operator '/' is ambiguous (with operand
types 'const Quantity<Km>' and 'const Quantity<Hour>')
Quantity<km_h> v = dist/time;
~~~~^~~~~
test-simple.cc:53:26: note: built-in candidate operator/(__int128, unsigned long long)
test-simple.cc:53:26: note: built-in candidate operator/(unsigned long, long double)
所以我的問題是:爲什麼clang++
拒絕呢?是一個有效的代碼?或gnu c++
應拒絕嗎?
在代碼有效的情況下,如何修改它以便clang++
接受它?
如何從表達式dist/time推導出類型'Ur'? – aschepler
[OT]:您可以查看http://www.boost.org/doc/libs/1_61_0/doc/html/boost_units.html – Jarod42
所有這一切歸結爲使用鑄造操作員的危險。問題是,即使代碼被接受,你確定哪一個函數或一組函數實際上被調用?程序員經常被這個問題所摧毀,他們期望有一組函數被調用,但是在其他方面正在做其他的事情。如果你擺脫了'double()'鑄造操作符,你可能沒有問題。 – PaulMcKenzie