问题
I have the following code:
template <typename T>
class A {
public:
static int a;
};
class B {
public:
static A<int> a1;
static A<double> a2;
};
int B::a1::a = 0; --> It gives an error "a1 is not a class, namespace, enumeration"
(I am using llvm compiler in XCode. I can reproduce the problem with gcc as well.)
How can I Declare/define/initialize a static member variable of template classes as static member variables of a class?
回答1:
Static members are defined base on their class. a
is static member of A
, a1
and a2
are static members of B
, you can't mix up their definition.
Define them seprately:
template <typename T>
int A<T>::a = 0;
A<int> B::a1;
A<double> B::a2;
If you want template specialization for definition of A<T>::a
, it will look like:
template <typename T>
int A<T>::a = 0;
template <typename T>
int A<int>::a = 1;
template <typename T>
int A<double>::a = 2;
Then for A<int>::a
the initial value will be 1
, for A<double>::a
will be 2
, for other types like A<char>::a
it will be 0
. Note the definitions is still independent of the definitions of class B
.
If you want to access a
from B::a1
, you could write B::a1.a
; since a1
is a A<int>
, the result is same as A<int>::a
.
来源:https://stackoverflow.com/questions/40098277/how-can-i-declare-define-initialize-a-static-member-variable-of-template-classes