By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
454,479 Members | 1,729 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 454,479 IT Pros & Developers. It's quick & easy.

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

P: n/a
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.
Nov 14 '08 #1
Share this Question
Share on Google+
4 Replies


P: n/a
On Nov 14, 3:30*pm, "l.s.rock...@web.de" <l.s.rock...@web.dewrote:
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.
Nov 14 '08 #2

P: n/a
Salt_Peter wrote:
On Nov 14, 3:30 pm, "l.s.rock...@web.de" <l.s.rock...@web.dewrote:
>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.
Nov 15 '08 #3

P: n/a
l.*********@web.de wrote:
Salt_Peter wrote:
>On Nov 14, 3:30 pm, "l.s.rock...@web.de" <l.s.rock...@web.dewrote:
>>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/184401563
Nov 15 '08 #4

P: n/a
l.*********@web.de wrote:
Salt_Peter wrote:
>On Nov 14, 3:30 pm, "l.s.rock...@web.de" <l.s.rock...@web.dewrote:
>>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/184401563
Nov 15 '08 #5

This discussion thread is closed

Replies have been disabled for this discussion.