Toon posts:

[C++] template inheritance member overloading

Pagina: 1
Acties:

Verwijderd

Topicstarter
Kort samengevat zit ik met het volgende probleem: ik probeer een memberfunctie aan te roepen van een template baseclass maar de compiler pikt dit niet. De code ziet er ongeveer als volgt uit:

C++:
1
2
3
4
5
6
7
//Abase.h

class Abase
{
  public:
    virtual void setval(string val) = 0;
};


C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//base.h
#include "Abase.h"

template <class T>
class base : Abase
{
  private:
    T val;
  public:
    void setval(T val);
};

//base.cpp
#include "base.h"

template <class T> void
base<T>::setval(T val)
{
  this->val = val;
}


C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//derivedint.h
#include "base.h"

class derivedint : public base<int>
{
  private:
    void setval(string val);
};

//derivedint.cpp
#include "derivedint.h"

void
derivedint::setval(string val)
{
  setval(atoi(val.c_str()));
}    


Dit geeft de volgende compiler-error:
derivedint.cpp: In member function `virtual void derivedint::setval(std::string)':
derivedint.cpp: error: no matching function for call to `derivedint::setval(double)'
derivedint.cpp: note: candidates are: virtual void derivedint::setval(std::string)
Waarom kan de compiler de setval uit de template niet vinden? Het volgende wil wel compilen maar niet linken:

C++:
1
2
3
4
5
void
derivedint::setval(string val)
{
  base<int>::setval(atoi(val.c_str()));
}    

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 00:05
Hmm, ik zie een paar problemen. Je gebruikt geen "export" dus je compiler eist dat de template definitie overal zichtbaar hebt - in de .h dus, en niet in de .cpp. Ten tweede vergeet je in je eerste voorbeeld inderdaad de base<int> kwalificatie. derivedint::setval is niet overloaded, dus in de scope van derivedint accepteert setval alleen maar een string.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Verwijderd

Topicstarter
Ik was er nu inderdaad ook aan uit gekomen. De reden dat de compiler klaagde kwam dus door het hiden van base::setval door de declaratie van derivedint::setval. keyword using is hiervoor de oplossing (ook hier uitgelegd).
En na de implementatie van de template naar de .h te verhuizen was inderdaad ook de linker-error weg.