lovely compiler error message - incompatible types
anonymous via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Thu Jul 2 11:00:51 PDT 2015
On Thursday, 2 July 2015 at 17:33:29 UTC, Laeeth Isharc wrote:
> Any thoughts on what could be leading to the following:
> ./../../marketdata/source/pricebar.d(397): Error: incompatible
> types for ((bar.high) + (bar.low)): 'FixedDecimal!(int, 8)' and
> 'FixedDecimal!(int, 8)'
> ../../../marketdata/source/pricebar.d(399): Error: incompatible
> types for ((bar.high) + (bar.low)): 'FixedDecimal!(int, 8)' and
> 'FixedDecimal!(int, 8)'
> ../../../marketdata/source/pricebar.d(547): Error: incompatible
> types for ((trueHigh(bars)) - (trueLow(bars))):
> 'FixedDecimal!(int, 8)' and 'FixedDecimal!(int, 8)'
>
> FixedDecimal is a fixed decimal point struct that stores values
> as an int or long and takes number of decimal places as the
> second compile term argument. It's possible, if not likely I
> have made a mistake in implementing operator overloads.
>
> Any thoughts on whether this is the likely cause, and if so
> which ones are likely to be the problem?
From the error messages it looks you didn't implement the
operator overloads properly.
You get the same message when FixedDecimal doesn't overload
anything at all:
----
struct FixedDecimal(T, uint n) {}
void main()
{
FixedDecimal!(int, 8) a, b;
auto c = a + b; /* line 5 */
}
----
test.d(5): Error: incompatible types for ((a) + (b)):
'FixedDecimal!(int, 8u)' and 'FixedDecimal!(int, 8u)'
----
You can get a more specific error by instantiating/calling things
explicitly. For example, here I messed up the parameter type:
----
struct FixedDecimal(T, uint n)
{
FixedDecimal opBinary(string op)(FixedDecimal!(T, 0))
{
return FixedDecimal.init;
}
}
void main()
{
FixedDecimal!(int, 8) a, b;
auto c = a + b; /* line 11 */
auto d = a.opBinary!"+"(b); /* line 12 */
}
----
test.d(11): Error: incompatible types for ((a) + (b)):
'FixedDecimal!(int, 8u)' and 'FixedDecimal!(int, 8u)'
test.d(12): Error: function test.FixedDecimal!(int,
8u).FixedDecimal.opBinary!"+".opBinary (FixedDecimal!(int, 0u)
_param_0) is not callable using argument types
(FixedDecimal!(int, 8u))
----
The error for line 11 just says that something went wrong. The
one for line 12 is a little more helpful.
More information about the Digitalmars-d-learn
mailing list