(Non)Abstract Funcs, Linker Errors, and Wild Goose Chases

Steven Schveighoffer schveiguy at yahoo.com
Fri Apr 27 03:57:28 PDT 2012


On Fri, 27 Apr 2012 03:36:48 -0400, Nick Sabalausky  
<SeeWebsiteToContactMe at semitwist.com> wrote:

> Consider this:
>
> abstract class Base
> {
>     void foo();  // Oops! Forgot "abstract"!
> }
>
> AIUI, that's *legal* because of two things:
>
> 1. Abstract classes are allowed to include functions that *do* have
> implementations.
>
> 2. D's compilation model, inherited from C, allows functions to be
> implemented in a separate source file if you use function stubs, such as
> above.
>
> In D's abstract classes, wanting to include an abstract function is much,
> much more common than wanting to include
> separate-compilation/function-stubbing. So get it wrong, and thanks to  
> those
> two normally-benign features above, you're treated to a mangled, ugly  
> linker
> error and the associated deep-sinking feeling of "......Fuck!"
>
> Now, maybe I was simply being stupid, but I just wasted two full days
> getting tripped up by this damn, uhh, non-bug. Completely reworked my  
> whole
> approach at least a couple times trying to work around...the wrong  
> issues.
> Even ran DustMite a couple times trying to get a test case demonstrating
> (what I *thought* was) DMD forgetting to instantiate some templated code.
> Only to eventually solve the whole damn thing by just simply typing in a
> stupid...little..."abstract ". Ugh.
>
> The fact that optlink crashed while spitting out the errors certainly  
> didn't
> help point me in the right direction. That's, of coruse, in addition to  
> the
> "Symbol undefined" errors including some fun red herrings that appered  
> to be
> from inside druntime/phobos.
>
> There is an issue in bugzilla for this, #6485 (
> http://d.puremagic.com/issues/show_bug.cgi?id=6485 ), but  
> *unfortunately* I
> think it's invalid for the reasons I described above. However, maybe it's
> just frustration over the last couple days talking, but I think at least
> *something* should be done about this, even if it's not what #6485 is
> requesting.
>
> Thoughts?

You have my sympathy.  Since working with D, I don't think I've *ever*  
used the "declare then implement" model.  My personal opinion is that the  
compiler should require .di files for declaring stubbed methods.

Other than that, I don't see a way to "fix" this problem, because you  
absolutely have to be able to declare an abstract class with non-abstract  
methods.  If you want a fully abstract class, use an interface ;)

Another thought, burn this into your neurons:

abstract class C
{
   abstract:
   ...
}

At least you only have to type it *once*.  Of course, you'd have to put  
all concrete methods before the abstract, which may hinder organization of  
your methods.

No really good solutions, sorry :(

-Steve


More information about the Digitalmars-d mailing list