#define EXPORT(x) x {}

namespace NSA
{
    class ClassA
    {
	private:
	    class Private
	    {
		public:
		    Private();
		    virtual ~Private();
		    void privmethod1(int);
		    void privmethod2(int);
	    };
	    Private* p;
	    class Internal
	    {
		public:
		    Internal();
		    virtual ~Internal();
		    void internal_method1(char);
		    void internal_method2(char);
	    };
	    Internal* i;
	public:
	    ClassA();
	    virtual ~ClassA();
	    virtual void generate_vt(const char*) const;
    };

    EXPORT(ClassA::Private::Private());
    EXPORT(ClassA::Private::~Private());
    EXPORT(void ClassA::Private::privmethod1(int));
    EXPORT(void ClassA::Private::privmethod2(int));

    EXPORT(ClassA::Internal::Internal());
    EXPORT(ClassA::Internal::~Internal());
    EXPORT(void ClassA::Internal::internal_method1(char));
    EXPORT(void ClassA::Internal::internal_method2(char));

    EXPORT(ClassA::ClassA());
    EXPORT(ClassA::~ClassA());
    EXPORT(void ClassA::generate_vt(const char*) const);
};

class ClassB
{
    public:
	ClassB();
	virtual ~ClassB();
	virtual void generate_vt(const char*) const;
};

EXPORT(ClassB::ClassB());
EXPORT(ClassB::~ClassB());
EXPORT(void ClassB::generate_vt(const char*) const);

class ClassC
{
    public:
	ClassC();
	virtual ~ClassC();
	virtual void generate_vt(const char*) const;
};

EXPORT(ClassC::ClassC());
EXPORT(ClassC::~ClassC());
EXPORT(void ClassC::generate_vt(const char*) const);

namespace NSB
{
    class ClassD : public NSA::ClassA, public ClassB, public ClassC
    {
	public:
	    ClassD();
	    virtual ~ClassD();
	    virtual void generate_vt(const char*) const;
    };

    EXPORT(ClassD::ClassD());
    EXPORT(ClassD::~ClassD());
    EXPORT(void ClassD::generate_vt(const char*) const);

    class Symver {
	public:
	    Symver();
	    ~Symver();

	    void symver_method1();
	    void symver_method2();
    };

    EXPORT(Symver::Symver());
    EXPORT(Symver::~Symver());
    EXPORT(void Symver::symver_method1());
    EXPORT(void Symver::symver_method2());

    class SymverOptional {
	public:
	    SymverOptional();
	    ~SymverOptional();
    };

    EXPORT(SymverOptional::SymverOptional());
    EXPORT(SymverOptional::~SymverOptional());
};
