Re: Link problem of static data members in template class
Am 25.07.2014 um 17:19 schrieb TS:
Today I came across a problem related to static data members initialization
in template class:
[..]
template <typename T>
class Object {
public:
static Type s;
};
template <typename T>
Type Object<T>::s; // okay
This is OK, because this is a definition of Object<T>::s for every T of
the static member of this primary template. This kind of declaration is
the equivalent form as for a static member of a non-template, such as
class ObjectInt {
public:
static int s;
};
int ObjectInt::s; // okay
// template<>
// Type Object<int>::s; // unable to link
Note that this is an explicit specialization of a member of some
template. For an explicit specialization, we can provide a non-defining
declaration (This is what you do above), or you can provide a defining
declaration (This would require an initializer, see 14.7.3 p13:
"An explicit specialization of a static data member of a template or an
explicit specialization of a static data member template is a definition
if the declaration includes an initializer; otherwise, it is a declaration."
)
// template<>
// Type Object<int>::s = Type(); // okay
This is OK, because as of the core language this is a defining
declaration of an explicit static member specialization.
I used GCC, and wondering if I can have a specialized definition of s
without a initialization.
No, this isn't possible. What you can do instead of writing
template<>
Type Object<int>::s = Type();
is to change this to
template<>
Type Object<int>::s{};
For T=int, there is no difference in either form, but the difference
matters if T would be a non-movable and non-copyable type, because the
copy-initialization used in the first form would require at least a
move-constructor.
HTH & Greetings from Bremen,
Daniel Kr?gler
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]