Re: Template subclass trouble
On May 14, 2:39 am, ekstrand <banner...@gmail.com> wrote:
I am having problems with subclassing a templated class with a
templated subclass. Consider the following program (I have
simplified it greatly from its origional form, the actual
header file can be provided upon request):
class A
{
public:
static void f() { }
};
template<typename T, typename Q>
class B
{
public:
B(T* t = 0) { }
B(B& b) { }
~B() { Q::f(); }
};
template<typename T>
class C:
public B<T, A>
{
public:
C(T* t = 0): B<T, A>(t) { }
C(C& c): B<T, A>(c) { }
};
C<int>
function() {
C<int> var;
return var;
}
int main()
{
C<int> var = function();
return 0;
}
I have a class that takes two template parameters. In order to
specify one of these template parameters without specifying
the other, I create a second templated class that is a
subclass of the other. This method seems to be the generally
accepted method for getting around the no templated typedefs
problem. However, when I try to build it with g++, I get the
following error message:
template_test.cpp: In function =91int main()':
template_test.cpp:33: error: no matching function for call to
=91C<int>::C(C<int>)'
template_test.cpp:22: note: candidates are: C<T>::C(C<T>&) [with T =
int]
template_test.cpp:21: note: C<T>::C(T*) [with T = int]
g++ cannot find the copy constructor even though the first
candidate is exactly what it needs.
G++ finds the copy constructor. The problem is that your copy
constructor prevents the compiler from generating one, and that
your copy constructor can't be used here, since it takes a
non-const reference (which can only be initialized by an
lvalue).
If I make the copy constructor const, the problem goes away.
In other words, you know what's wrong with your code.
Also, this code correctly builds on VisualC++ 2005. Is there
something I'm missing, or have I found a bug in g++?
A bug in VC++, rather. Your code isn't legal, and shouldn't
compile.
--
James Kanze (GABI Software) email:james.kanze@gmail.com
Conseils en informatique orient=E9e objet/
Beratung in objektorientierter Datenverarbeitung
9 place S=E9mard, 78210 St.-Cyr-l'=C9cole, France, +33 (0)1 30 23 00 34