[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-core-devel
Subject:    Strange problem with msvc in kdepimlibs/kcal
From:       "Christian Ehrlicher" <Ch.Ehrlicher () gmx ! de>
Date:       2006-07-21 6:05:00
Message-ID: 20060721060500.236300 () gmx ! net
[Download RAW message or body]

Hi,

I want to compile kdepimlibs with msvc (because kdebase needs it) and after some \
minor problems I now get a strange error in kcal. I've attached a small testcase to \
show the problem.

The output with gcc:

D - Recurrence::Observer::Observer()
G - Incidence::Incidence()
A - RecurrenceRule::Observer::Observer()
E - Recurrence::Recurrence()
F - void Recurrence::addObserver(Recurrence::Observer*)

and msvc:

A - RecurrenceRule::Observer::Observer
G - Incidence::Incidence
A - RecurrenceRule::Observer::Observer
E - Recurrence::Recurrence
F - Recurrence::addObserver

As you can see, different constructors are called.
In my understanding, both of them are correct. But I don't know what the c++ standard \
says about such an ambiguity.

Any ideas how this could be solved without renaming one of the classes? 

Christian
-- 


Echte DSL-Flatrate dauerhaft für 0,- Euro*!
"Feel free" mit GMX DSL! http://www.gmx.net/de/go/dsl


["main.cpp" (text/plain)]

#include <stdio.h>

#ifndef __GNUC__
# define __PRETTY_FUNCTION__ __FUNCTION__
#endif

class RecurrenceRule
{
   public:
	class Observer
    {
        public:
    		Observer() {fprintf(stderr, "A - %s\n", __PRETTY_FUNCTION__);}
	};
	RecurrenceRule(){fprintf(stderr, "B - %s\n", __PRETTY_FUNCTION__);}
	void addObserver(Observer *) {fprintf(stderr, "C - %s\n", __PRETTY_FUNCTION__);}
};


class Recurrence : public RecurrenceRule::Observer
{
   public:
	class Observer
    {
        public:
		Observer() {fprintf(stderr, "D - %s\n", __PRETTY_FUNCTION__);}
	};
	Recurrence() {fprintf(stderr, "E - %s\n", __PRETTY_FUNCTION__);}
	void addObserver(Observer *) {fprintf(stderr, "F - %s\n", __PRETTY_FUNCTION__);}
};

class Incidence : public Recurrence::Observer
{
	public:
		Incidence();
};

Incidence::Incidence() : Recurrence::Observer()
{
    fprintf(stderr, "G - %s\n", __PRETTY_FUNCTION__);
    Recurrence *myRec = new Recurrence();
    myRec->addObserver(NULL);
//	myRec->addObserver(this);       // doesn't work with msvc
}

int main(int argc, char**argv)
{
    Incidence *tmp = new Incidence();
    delete tmp;
    return 1;
}


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic