/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
Template nedarvning og members af samme na~
Fra : Bear


Dato : 20-11-04 14:11

Hello there

Jeg har en klasse ClientChannel som nedarver fra en template kaldet Channel.
Template'en Channel har en member der hedder GetSubChannel(string) og den
nedarvede klasse ClientChannel har en member der hedder GetSubChannel(int).

Såfremt jeg prøver at kalde ClientChannel::GetSubChannel(string("blah"))
siger compileren at den ikke kan konvertere string til int. Hvordan fan' kan
det lade sig gøre når den member findes i dens parent??

Channel er defineret på følgende måde:

template < class CHANNEL, class USER >
class Channel
{
public:

typedef boost::shared_ptr< CHANNEL > channel_t;
Channel(std::string szChannelName)
: m_szChannelName(szChannelName){}
//...
virtual channel_t GetSubChannell(std::string szName)
{ ... }
//...
};

Og ClientChannel er defineret på følgende måde:

class ClientChannel : public Channel< ClientChannel, SoundUser >
{
public:
ClientChannel(std::string szChannelName);
virtual void SetChannelID(int nID);
virtual int GetChannelID();
virtual clientchannel_t GetSubChannel(int nChannelID, bool bRecursive =
false);
private:
int m_nChannelID;
};
}

Hvis jeg ændrer ClientChannel::GetSubChannel(..)'s navn til
ClientChannel::GetSubChannel_(..) så kompilerer det fint. Hvad er det
liiiiiiige der går galt?

Jeg har prøvet at kompilere det både med g++ og MSC++

Mvh

Bjørn D. Rasmussen



 
 
Bertel Brander (20-11-2004)
Kommentar
Fra : Bertel Brander


Dato : 20-11-04 14:26

Bear wrote:
> Hello there
>
> Jeg har en klasse ClientChannel som nedarver fra en template kaldet Channel.
> Template'en Channel har en member der hedder GetSubChannel(string) og den
> nedarvede klasse ClientChannel har en member der hedder GetSubChannel(int).
>
> Såfremt jeg prøver at kalde ClientChannel::GetSubChannel(string("blah"))
> siger compileren at den ikke kan konvertere string til int. Hvordan fan' kan
> det lade sig gøre når den member findes i dens parent??
>
> Channel er defineret på følgende måde:
>
> template < class CHANNEL, class USER >
> class Channel
> {
> public:
>
> typedef boost::shared_ptr< CHANNEL > channel_t;
> Channel(std::string szChannelName)
> : m_szChannelName(szChannelName){}
> //...
> virtual channel_t GetSubChannell(std::string szName)

Skulle det være GetSubChannel med et l ?

--
"I learned more from a three minute record
than I ever learned in school"
- Bruce Springsteen

Bear (20-11-2004)
Kommentar
Fra : Bear


Dato : 20-11-04 14:37


"Bertel Brander" <bertel@post4.tele.dk> wrote in message
news:419f45d7$0$11602$edfadb0f@dread14.news.tele.dk...
> Bear wrote:
>> Hello there
>>
>> Jeg har en klasse ClientChannel som nedarver fra en template kaldet
>> Channel. Template'en Channel har en member der hedder
>> GetSubChannel(string) og den nedarvede klasse ClientChannel har en member
>> der hedder GetSubChannel(int).
>>
>> Såfremt jeg prøver at kalde ClientChannel::GetSubChannel(string("blah"))
>> siger compileren at den ikke kan konvertere string til int. Hvordan fan'
>> kan det lade sig gøre når den member findes i dens parent??
>>
>> Channel er defineret på følgende måde:
>>
>> template < class CHANNEL, class USER >
>> class Channel
>> {
>> public:
>>
>> typedef boost::shared_ptr< CHANNEL > channel_t;
>> Channel(std::string szChannelName)
>> : m_szChannelName(szChannelName){}
>> //...
>> virtual channel_t GetSubChannell(std::string szName)
>
> Skulle det være GetSubChannel med et l ?

Doh, ja. Ser ud til at jeg fik publiseret en testudgave :)

Altså:

template < class CHANNEL, class USER >
class Channel
{
public:

typedef boost::shared_ptr< CHANNEL > channel_t;
Channel(std::string szChannelName)
: m_szChannelName(szChannelName){}
//...
virtual channel_t GetSubChannel(std::string szName)
{ ... }
//...
};

Og ClientChannel er defineret på følgende måde:

class ClientChannel : public Channel< ClientChannel, SoundUser >
{
public:
ClientChannel(std::string szChannelName);
virtual void SetChannelID(int nID);
virtual int GetChannelID();
virtual clientchannel_t GetSubChannel(int nChannelID, bool bRecursive =
false);
private:
int m_nChannelID;
};
}



>
> --
> "I learned more from a three minute record
> than I ever learned in school"
> - Bruce Springsteen



Mogens Hansen (20-11-2004)
Kommentar
Fra : Mogens Hansen


Dato : 20-11-04 17:10


"Bear" <bdr@NOSPAM.sol.dk> wrote in message
news:cnnfpl$p61$1@news.cybercity.dk...

[8<8<8<]
> Hvis jeg ændrer ClientChannel::GetSubChannel(..)'s navn til
> ClientChannel::GetSubChannel_(..) så kompilerer det fint. Hvad er det
> liiiiiiige der går galt?

Dit spørgsmål har ikke noget med templates at gøre - det gælder generelt ved
nedarvning.
Overload resolution sker ikke på på tværs af class scope.

Følgende oversætter _ikke_:
class base
{
public:
void foo(int);
};

class derived : public base
{
public:
void foo(const char*);
};

int main()
{
derived d;
d.foo(1);
}

Man kan bringe basis-klassens funktion ind i scope igen ved at bruge et
"using" direktiv.
Altså følgende oversætter:
class base
{
public:
void foo(int);
};

class derived : public base
{
public:
using base::foo;
void foo(const char*);
};

int main()
{
derived d;
d.foo(1);
}


Altså du kan skrive

class ClientChannel : class ClientChannel : public Channel< ClientChannel,
SoundUser >
{
...
using Channel< ClientChannel, SoundUser >::GetSubChannel;

...
};

Se eventuelt
The C++ Programming Language, Special Edition
Bjarne Stroustrup
ISBN 0-201-70073-5
side 392 for yderligere information

Venlig hilsen

Mogens Hansen



Bear (20-11-2004)
Kommentar
Fra : Bear


Dato : 20-11-04 17:33

Mange tak for svaret

"Mogens Hansen" <mogens_h@dk-online.dk> wrote in message
news:cnnq7r$1838$1@news.cybercity.dk...
>
> "Bear" <bdr@NOSPAM.sol.dk> wrote in message
> news:cnnfpl$p61$1@news.cybercity.dk...
>
> [8<8<8<]
>> Hvis jeg ændrer ClientChannel::GetSubChannel(..)'s navn til
>> ClientChannel::GetSubChannel_(..) så kompilerer det fint. Hvad er det
>> liiiiiiige der går galt?
>
> Dit spørgsmål har ikke noget med templates at gøre - det gælder generelt
> ved nedarvning.
> Overload resolution sker ikke på på tværs af class scope.
>
> Følgende oversætter _ikke_:
> class base
> {
> public:
> void foo(int);
> };
>
> class derived : public base
> {
> public:
> void foo(const char*);
> };
>
> int main()
> {
> derived d;
> d.foo(1);
> }
>
> Man kan bringe basis-klassens funktion ind i scope igen ved at bruge et
> "using" direktiv.
> Altså følgende oversætter:
> class base
> {
> public:
> void foo(int);
> };
>
> class derived : public base
> {
> public:
> using base::foo;
> void foo(const char*);
> };
>
> int main()
> {
> derived d;
> d.foo(1);
> }
>
>
> Altså du kan skrive
>
> class ClientChannel : class ClientChannel : public Channel< ClientChannel,
> SoundUser >
> {
> ...
> using Channel< ClientChannel, SoundUser >::GetSubChannel;
>
> ...
> };
>
> Se eventuelt
> The C++ Programming Language, Special Edition
> Bjarne Stroustrup
> ISBN 0-201-70073-5
> side 392 for yderligere information
>
> Venlig hilsen
>
> Mogens Hansen
>



Søg
Reklame
Statistik
Spørgsmål : 177579
Tips : 31968
Nyheder : 719565
Indlæg : 6409073
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste