views:

471

answers:

2

I find one of the most time-consuming compiler errors for me is "cannot instantiate abstract class," since the problem is always that I didn't intend for the class to be abstract and the compiler doesn't list which functions are abstract. There's got to be a more intelligent way to solve these than reading the headers 10 times until I finally notice a missing "const" somewhere. How do you solve these?

+3  A: 

G++ tells you exactly which functions are abstract, and where they are declared:

class foo {
        virtual void x() const = 0;
};

class bar : public foo {
        virtual void x() { }
};

void test() {
        new bar;
}

test.cpp: In function ‘void test()’:
test.cpp:10: error: cannot allocate an object of abstract type ‘bar’
test.cpp:5: note:   because the following virtual functions are pure within ‘bar’:
test.cpp:2: note:       virtual void foo::x() const

So perhaps try compiling your code with G++, or specify your compiler so others can give useful suggestions for your specific compiler.

bdonlan
+6  A: 

cannot instantiate abstract class

Based on this error, my guess is that you are using Visual Studio (since that's what Visual C++ says when you try to instantiate an abstract class).

Look at the Visual Studio Output window (View => Output); the output should include a statement after the error stating:

stubby.cpp(10) : error C2259: 'bar' : cannot instantiate abstract class
due to following members:
'void foo::x(void) const' : is abstract
stubby.cpp(2) : see declaration of 'foo::x'

(That is the error given for bdonlan's example code)

In Visual Studio, the "Error List" window only displays the first line of an error message.

James McNellis