【发布时间】:2015-04-27 07:24:02
【问题描述】:
考虑以下代码:
//header.h
template<class T>
class A
{
static int x;
};
template<class T>
int A<T>::x = 0;
//source1.cpp
#include "header.h"
void f(){} // dummy function
//main.cpp
#include "header.h"
int main(){}
在这种情况下,代码编译完美,没有错误,但如果我从类中删除模板限定符
class A
{
static int x;
};
int A::x = 0;
- 在这种情况下,编译器因 x 的多个定义而出错。任何人都可以解释这种行为吗?
- 而当模板类的静态变量被初始化/实例化?
【问题讨论】:
-
1) 类模板成员仅在需要时实例化。 2) 这是一个棘手的问题。
-
Template static variable 的可能重复项
-
简而言之,从不在头文件中实例化静态变量,这几乎每次都会带来麻烦。每次包含头文件时,静态都会被实例化。
-
实际上,当你的类是模板时,编译器会处理多重定义。我的问题是,这个静态是否在不使用此类的情况下初始化和实例化?
标签: c++ templates static instantiation linkage