Thread overview
Linker complaining about interface methods
Apr 05, 2007
Daniel Keep
Re: Linker complaining about interface methods -- at wits end
Apr 06, 2007
Daniel Keep
Apr 06, 2007
Daniel Keep
Apr 07, 2007
Dan
April 05, 2007
Ugh.

I'm currently knee-deep in trying to get this code to work, and the linker spits this out at me:

util\dataset.obj(dataset)
 Error 42: Symbol Undefined _D4util7dataset12IFieldParser7getDataMFZAh

Here's the definition of IFieldParser:

interface IFieldParser : ContentHandler
{
    ubyte[] getData();
}

Where ContentHandler is just the SAX interface (which doesn't have a
getData method).

The "getData" method is used exactly twice in the code on instances of IFieldParser:

IFieldParser fieldParser;
// ...
fieldParser.getData();

If I comment the "fieldParser.getData" lines out, the code compiles and links fine.

Anyone have *any* idea what's going on here?

	-- Daniel

-- 
int getRandomNumber()
{
    return 4; // chosen by fair dice roll.
              // guaranteed to be random.
}

http://xkcd.com/

v2sw5+8Yhw5ln4+5pr6OFPma8u6+7Lw4Tm6+7l6+7D i28a2Xs3MSr2e4/6+7t4TNSMb6HTOp5en5g6RAHCP  http://hackerkey.com/
April 06, 2007

Daniel Keep wrote:
> Ugh.
> 
> I'm currently knee-deep in trying to get this code to work, and the linker spits this out at me:
> 
> util\dataset.obj(dataset)
>  Error 42: Symbol Undefined _D4util7dataset12IFieldParser7getDataMFZAh
> 
> Here's the definition of IFieldParser:
> 
> interface IFieldParser : ContentHandler
> {
>     ubyte[] getData();
> }
> 
> Where ContentHandler is just the SAX interface (which doesn't have a
> getData method).
> 
> The "getData" method is used exactly twice in the code on instances of IFieldParser:
> 
> IFieldParser fieldParser;
> // ...
> fieldParser.getData();
> 
> If I comment the "fieldParser.getData" lines out, the code compiles and links fine.
> 
> Anyone have *any* idea what's going on here?
> 
> 	-- Daniel
> 

After a few hours sleep, I've upgraded to DMD v1.010 (on the off chance that fixed it), but that didn't help.

I tried changing the "fieldParser.getData()" calls to
"fieldParser.getFieldData()" *without* changing the actual interface or
the classes.  As expected, the compiler omitted some errors:

dataset.dw(244): Error: no property 'getFieldData' for type
'util.dataset.IFieldParser'
dataset.dw(244): Error: function expected before (), not 1 of type int
dataset.dw(243): function
util.dataset.IParserControl.setCellField(CellID ,char[],ubyte[]) does
not match parameter types (CellID ,char[],int)
dataset.dw(244): Error: cannot implicitly convert expression (1()) of
type int to ubyte[]

So it's clearly seeing the method.  Just in case it just didn't like the name "getData", I then went and changed the interface to read

interface IFieldParser : ContentHandler
{
    ubyte[] getFieldData();
}

Again, *did not* update the classes that implemented the interface -- they still had "getData" methods.  This time, it actually compiled, and gave me a linker error:

util\dataset.obj(dataset)
 Error 42: Symbol Undefined _D4util7dataset12IFieldParser12getFieldDataMFZAh

So the compiler can obviously *see* the method, but for some reason, it's ignoring the fact that it's on an interface, and is apparently treating it as a static member function!  Not only that, but the classes that implement the interface apparently aren't being checked to make sure they implement this method!

It gets weirder.  The classes that implement IFieldParser also have to implement the SAX ContentHandler interface.  If I take one of the methods from *that* interface, say "characters", and rename it to "_characters", compilation fails saying that:

util\dataset.d(689): class
util.dataset.SimpleParser!(bool,toBool).SimpleParser interface function
IFieldParser.characters isn't implemented

I'm completely out of ideas.  Does *anyone* have any thoughts on what's going on?  Pretty please? :(

	-- Daniel

-- 
int getRandomNumber()
{
    return 4; // chosen by fair dice roll.
              // guaranteed to be random.
}

http://xkcd.com/

v2sw5+8Yhw5ln4+5pr6OFPma8u6+7Lw4Tm6+7l6+7D i28a2Xs3MSr2e4/6+7t4TNSMb6HTOp5en5g6RAHCP  http://hackerkey.com/
April 06, 2007
Ok, I worked out how to fix it.

The IFieldParser interface was private to the module.  Once I made it public, it worked.

I just wasted a day because DMD barfed on a private interface :'(

If you'll excuse me, I need to go quietly sob in the corner...

	-- Daniel

-- 
int getRandomNumber()
{
    return 4; // chosen by fair dice roll.
              // guaranteed to be random.
}

http://xkcd.com/

v2sw5+8Yhw5ln4+5pr6OFPma8u6+7Lw4Tm6+7l6+7D i28a2Xs3MSr2e4/6+7t4TNSMb6HTOp5en5g6RAHCP  http://hackerkey.com/
April 07, 2007
Daniel Keep Wrote:
> I just wasted a day because DMD barfed on a private interface :'(
> 
> If you'll excuse me, I need to go quietly sob in the corner...

Heh.
It's hard getting help on Good Friday.  The christians are all out worshiping statues of Jesus and stuff, and we're all out partying.

The definition of "private" is "will not be seen by the linker".  I feel for ya though man.  I've spent days on stupid shit like that too, and it really does make ya wanna cry.

That's what pair programming is for though.  So you can have someone else see it for you.

And... take a break man, it's the weekend.

Sincerely,
me