This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug c++/9050] Can't explicitly specialize C++ constructor templates
- From: "chris at pgsql dot com" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 22 Jul 2004 17:05:17 -0000
- Subject: [Bug c++/9050] Can't explicitly specialize C++ constructor templates
- References: <20021223190601.9050.martin@xemacs.org>
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
------- Additional Comments From chris at pgsql dot com 2004-07-22 17:05 -------
Hi All,
I've been working on a project for the last month or so and have ran into this
bug under G++ 2.95.4. The code I have is different from the code above and is
as follows:
test.hxx
template <class T> class Test {
private:
T *handle_object;
public:
Test(T * = NULL);
Test(const Test<T> &);
~Test();
bool operator==(const Test<T> &) const;
};
class MyTest;
typedef Test<MyTest> MyTestHandle;
Test.cxx:
template <class T> Test<T>::Test(T* th) {
this->handle_object = th;
if (this->handle_object != NULL) {
this->handle_object->counter++;
}
}
template <class T> Test<T>::Test(const Test<T> &source) {
this->handle_object = source.handle_object;
if (this->handle_object != NULL) {
this->handle_object->counter++;
}
}
template <class T> Test<T>::~Test() {
if (this->handle_object != NULL && this->handle_object->counter != 0) {
this->handle_object->counter--;
}
if (this->handle_object != NULL && this->handle_object->counter == 0) {
delete this->handle_object;
this->handle_object = NULL;
}
}
template <class T> bool Test<T>::operator==(const Test<T> &source) const {
return (this->handle_object == source->handle_object);
}
When I left it in this format I got this error:
test/libtest.a(MyBigTest.o): In function `MyBigTest::add(Test<MyTest> const &)':
/usr/local/include/stlport/stl/_construct.h:237: undefined reference to
`Test<MyTest>::Test(Test<MyTest> const &)'
test/libtest.a(MyBigTest.o): In function `MyBigTest::remove(Test<MyTest> &)':
/usr/local/include/stlport/stl/_list.h:122: undefined reference to
`Test<MyTest>::operator==(Test<MyTest> const &) const'
test/libtest.a(MyBigTest.o): In function `MyBigTest::remove(Test<MyTest> &)':
/usr/local/include/stlport/stl/_construct.h:360: undefined reference to
`Test<MyTest>::~Test(void)'
test/libtest.a(MyBigTest.o): In function `_STL::allocator<Test<MyTest>
>::~allocator(void)':
/usr/local/include/stlport/stl/_alloc.h
(.gnu.linkonce.t.clear__Q24_STLt10_List_base2Zt14Test1Z6MyTestZQ24_STLt9allocato
r1Zt14Test1Z6MyTest+0x26): undefined reference to `Test<MyTest>::~Test(void)'
*** Error code 1
Research showed that I needed to instantiate my template using:
template void Test<MyTest>();
in the Test.cpp file so that it can create an instance in the libtest.a file,
so that when I compile that into my app it would link properly. However, I now
run into a compiler error (rather then a linking error) like this:
Test.cxx:52: `Test<MyTest>' specified as declarator-id
Test.cxx:52: two or more data types in declaration of `Test<MyTest>'
Test.cxx:52: non-template used as template
Test.cxx:52: confused by earlier errors, bailing out
*** Error code 1
Which I believe is related to the issue above. I'm building under FreeBSD 4.10-
STABLE. Does anyone have a fix for this yet? or did I do something wrong?
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=9050