Re: Multiple definitions of specialized template member function
On 7/19/07 8:56 AM, in article f7n7u3$goe$1@polsl.pl, "Dariusz Bismor"
<Dariusz.Bismor@polsl.pl> wrote:
Having the following code, I get
"multiple definition of `void C::foo<double>(double const&)'"
linker error (gcc version 4.1.2 20070302 (prerelease)
(4.1.2-1mdv2007.1)). I've googled for the problem and found out that
inlining specialized foo version solves it (general version may be
inline or not). But I wonder if it is the correct and only solution.
If so, how does it work?
//*** File c.h ***
#include <iostream>
class C{
public:
C();
template <typename T>
void foo( const T& x ){
std::cout << "C general version, x = " << x << std::endl;
}
};
template <>
void C::foo(const double& x ){
std::cout << "C specialized, x = " << x << std::endl;
}
An explicit specialization of a member template function follows pretty much
the same conventions as any other member function of a class. In particular:
inline member functions are defined in the class header file, while
non-inline member functions are declared in the class header file - but
defined in the class source file.
So in this case an explicit specialization of a (non-inline) C::foo<double>
would be declared in "File c.h":
template<> void C::foo<double>( const double& );
....and then defined in "File c.cpp":
template <>
void C::foo( const double& x )
{
std::cout << "C specialized, x = " << x << std::endl;
}
Note that C::foo<double>'s explicit specialization declaration in the class
header file prevents C::foo<double> from being implicitly instantiated
anywhere it may be needed. Therefore (assuming that C::foo<double> is called
at some point), the programmer must ensure that C::foo<double> is defined
somewhere in the program's sources. Otherwise a missing definition for
C::foo<double> will lead to an error at link time - just as it would with
any other call to a non-inline function whose definition cannot be found.
Greg
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]