|
| 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
>
| |
|
|