[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.c++

how to call an inherited, template class constructor from initializer list of an inheriting, non-template class constructor

l.s.rockfan@web.de

11/14/2008 8:30:00 PM

Hello,

how do i have to call an inherited, templated class constructor from the
initializer list of the inheriting, non-templated class constructor?

example code:


template<typename T>
class A
{
protected:
sometype* something;
T something_else; /*gives the template some sense here*/
public:
A(sometype* param) : something(param) {};
}


class B : public A<int>
{
public:
B(sometype* param) : A(param) {}; // <== Compiler Error

/* further member functions */
}


The compiler always tries to identify A as a member variable not being
found, instead of the base class' constructor.
4 Answers

Salt_Peter

11/14/2008 11:05:00 PM

0

On Nov 14, 3:30 pm, "l.s.rock...@web.de" <l.s.rock...@web.de> wrote:
> Hello,
>
> how do i have to call an inherited, templated class constructor from the
> initializer list of the inheriting, non-templated class constructor?
>
> example code:
>
> template<typename T>
> class A
> {
> protected:
>         sometype* something;
>         T something_else;       /*gives the template some sense here*/
> public:
>         A(sometype* param) : something(param) {};
>
> }
>
> class B : public A<int>
> {
> public:
>         B(sometype* param) : A(param) {}; // <== Compiler Error
>
>         /* further member functions */
>
> }
>
> The compiler always tries to identify A as a member variable not being
> found, instead of the base class' constructor.

The following is a class:

class A { };

this is not:

class A { }

The following declares a class and defines a constructor:

class A
{
A() { }
};

or

// A.hpp (missing include guards)
class A
{
A(); // declaration only
};

// A.cpp
A::A() { } // definition

Basically, a semicolon denotes a declaration.

l.s.rockfan@web.de

11/15/2008 10:06:00 AM

0

Salt_Peter wrote:
> On Nov 14, 3:30 pm, "l.s.rock...@web.de" <l.s.rock...@web.de> wrote:
>> Hello,
>>
>> how do i have to call an inherited, templated class constructor from the
>> initializer list of the inheriting, non-templated class constructor?
>>
>> example code:
>>
>> template<typename T>
>> class A
>> {
>> protected:
>> sometype* something;
>> T something_else; /*gives the template some sense here*/
>> public:
>> A(sometype* param) : something(param) {};
>>
>> }
>>
>> class B : public A<int>
>> {
>> public:
>> B(sometype* param) : A(param) {}; // <== Compiler Error
>>
>> /* further member functions */
>>
>> }
>>
>> The compiler always tries to identify A as a member variable not being
>> found, instead of the base class' constructor.
>
> The following is a class:
>
> class A { };
>
> this is not:
>
> class A { }
>
> The following declares a class and defines a constructor:
>
> class A
> {
> A() { }
> };
>
> or
>
> // A.hpp (missing include guards)
> class A
> {
> A(); // declaration only
> };
>
> // A.cpp
> A::A() { } // definition
>
> Basically, a semicolon denotes a declaration.

That's not the point. I just forgot the semicolons in the example.

I found out, that my problem is not only specific to explicit
constructor calls, but occurs everytime I want to call a polymorph
member function of the base class (which is a template class).

I get an undefined reference error from ld.

That's why I start a new post for the more general problem description.

l.s.rockfan@web.de

11/15/2008 1:17:00 PM

0

l.s.rockfan@web.de wrote:
> Salt_Peter wrote:
>> On Nov 14, 3:30 pm, "l.s.rock...@web.de" <l.s.rock...@web.de> wrote:
>>> Hello,
>>>
>>> how do i have to call an inherited, templated class constructor from the
>>> initializer list of the inheriting, non-templated class constructor?
>>>
>>> example code:
>>>
>>> template<typename T>
>>> class A
>>> {
>>> protected:
>>> sometype* something;
>>> T something_else; /*gives the template some sense here*/
>>> public:
>>> A(sometype* param) : something(param) {};
>>>
>>> }
>>>
>>> class B : public A<int>
>>> {
>>> public:
>>> B(sometype* param) : A(param) {}; // <== Compiler Error
>>>
>>> /* further member functions */
>>>
>>> }
>>>
>>> The compiler always tries to identify A as a member variable not being
>>> found, instead of the base class' constructor.
>>
>> The following is a class:
>>
>> class A { };
>>
>> this is not:
>>
>> class A { }
>>
>> The following declares a class and defines a constructor:
>>
>> class A
>> {
>> A() { }
>> };
>>
>> or
>>
>> // A.hpp (missing include guards)
>> class A
>> {
>> A(); // declaration only
>> };
>>
>> // A.cpp
>> A::A() { } // definition
>>
>> Basically, a semicolon denotes a declaration.
>
> That's not the point. I just forgot the semicolons in the example.
>
> I found out, that my problem is not only specific to explicit
> constructor calls, but occurs everytime I want to call a polymorph
> member function of the base class (which is a template class).
>
> I get an undefined reference error from ld.
> That's why I start a new post for the more general problem description.

Okay, the problem was that I have used neither the import nor the export
model for template source code organization[1].

I chose the import model and moved the definitions of the template class
member funtions into the header file and everything works.

[1] http://www.ddj.com/cpp...

l.s.rockfan@web.de

11/15/2008 1:22:00 PM

0

l.s.rockfan@web.de wrote:
> Salt_Peter wrote:
>> On Nov 14, 3:30 pm, "l.s.rock...@web.de" <l.s.rock...@web.de> wrote:
>>> Hello,
>>>
>>> how do i have to call an inherited, templated class constructor from the
>>> initializer list of the inheriting, non-templated class constructor?
>>>
>>> example code:
>>>
>>> template<typename T>
>>> class A
>>> {
>>> protected:
>>> sometype* something;
>>> T something_else; /*gives the template some sense here*/
>>> public:
>>> A(sometype* param) : something(param) {};
>>>
>>> }
>>>
>>> class B : public A<int>
>>> {
>>> public:
>>> B(sometype* param) : A(param) {}; // <== Compiler Error
>>>
>>> /* further member functions */
>>>
>>> }
>>>
>>> The compiler always tries to identify A as a member variable not being
>>> found, instead of the base class' constructor.
>>
>> The following is a class:
>>
>> class A { };
>>
>> this is not:
>>
>> class A { }
>>
>> The following declares a class and defines a constructor:
>>
>> class A
>> {
>> A() { }
>> };
>>
>> or
>>
>> // A.hpp (missing include guards)
>> class A
>> {
>> A(); // declaration only
>> };
>>
>> // A.cpp
>> A::A() { } // definition
>>
>> Basically, a semicolon denotes a declaration.
>
> That's not the point. I just forgot the semicolons in the example.
>
> I found out, that my problem is not only specific to explicit
> constructor calls, but occurs everytime I want to call a polymorph
> member function of the base class (which is a template class).
>
> I get an undefined reference error from ld.
> That's why I start a new post for the more general problem description.

Okay, the problem was that I have used neither the import nor the export
model for template source code organization[1].

I chose the import model and moved the definitions of the template class
member funtions into the header file and everything is working now.

[1] http://www.ddj.com/cpp...