This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug c++/24164] New: Explicit instantiation of template has no effect.
- From: "gcc-bugzilla at gcc dot gnu dot org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 1 Oct 2005 17:04:20 -0000
- Subject: [Bug c++/24164] New: Explicit instantiation of template has no effect.
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
Here are three files that illustrate the problem.
Header file "t.hpp":
namespace arrpp {
template <typename B>
class A {
public:
A();
};
}
File implementing class A, called t.cc:
#include "t.hpp"
template class arrpp::A<char>; // instatiate class
template <typename B> arrpp::A<B>:: A(){} // define ctor
File containing main, called xt.cc:
#include "t.hpp"
int main(int argc, char **argv) { arrpp::A<char> x; }
Produce t.o and xt.o:
gcc -c t.cc xt.cc
Examine symbols in t.o:
nm t.o
(Produces no output, indicating that no symbols are defined.)
Try to link object files:
gcc -o xt xt.o t.o -lstdc++
xt.o: In function `main':
xt.cc:(.text+0x24): undefined reference to `arrpp::A<char>::A()'
collect2: ld returned 1 exit status
On a machine with g++-3.3, this code works fine (links and runs, producing no
output).
Environment:
System: Linux dogwood 2.6.8-1-k7 #1 Thu Oct 7 02:47:47 EDT 2004 i686 GNU/Linux
Architecture: i686
host: i486-pc-linux-gnu
build: i486-pc-linux-gnu
target: i486-pc-linux-gnu
configured with: ../src/configure -v --enable-languages=c,c++,java,f95,objc,ada,treelang --prefix=/usr --enable-shared --with-system-zlib --libexecdir=/usr/lib --enable-nls --without-included-gettext --enable-threads=posix --program-suffix=-4.0 --enable-__cxa_atexit --enable-libstdcxx-allocator=mt --enable-clocale=gnu --enable-libstdcxx-debug --enable-java-gc=boehm --enable-java-awt=gtk --with-java-home=/usr/lib/jvm/java-1.4.2-gcj-4.0-1.4.2.0/jre --enable-mpfr --disable-werror --enable-checking=release i486-linux-gnu
How-To-Repeat:
See above. Here is the preprocessor output for t.cc:
# 1 "t.cc"
# 1 "<built-in>"
# 1 "<command line>"
# 1 "t.cc"
# 1 "t.hpp" 1
namespace arrpp {
template <typename B>
class A {
public:
A();
};
}
# 2 "t.cc" 2
template class arrpp::A<char>;
template <typename B>
arrpp::A<B>::
A(){}
Here is the preprocessor output for xt.cc:
# 1 "xt.cc"
# 1 "<built-in>"
# 1 "<command line>"
# 1 "xt.cc"
# 1 "t.hpp" 1
namespace arrpp {
template <typename B>
class A {
public:
A();
};
}
# 2 "xt.cc" 2
int main(int argc, char **argv) {
arrpp::A<char> x;
}
------- Additional Comments From rogers at anthro dot utah dot edu 2005-10-01 17:04 -------
Fix:
Here is a patch for t.cc that provides a work-around. It instantiates
the class by declaring a variable:
--- t.cc 2005-10-01 10:53:33.038810604 -0600
+++ t2.cc 2005-10-01 10:53:47.335552612 -0600
@@ -1,6 +1,6 @@
#include "t.hpp"
-template class arrpp::A<char>;
+arrpp::A<char> foo;
template <typename B>
arrpp::A<B>::
--
Summary: Explicit instantiation of template has no effect.
Product: gcc
Version: 4.0.1
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: rogers at anthro dot utah dot edu
CC: gcc-bugs at gcc dot gnu dot org
GCC build triplet: i486-pc-linux-gnu
GCC host triplet: i486-pc-linux-gnu
GCC target triplet: i486-pc-linux-gnu
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=24164