2010-02-08 73 views
10

对于具有静态成员/对象的类的每个实例,通常一个类的静态成员/对象是相同的。不管怎么样,如果静态对象是模板类的一部分,也取决于模板参数?例如,像这样:C++静态模板成员,每个模板类型的一个实例?

template<class T> 
class A{ 
public: 
    static myObject<T> obj; 
} 

如果我投了一个对象作为int,另一种为float,我想就会有两个obj,每一个类型?

如果我将创建多个对象的类型为int和多个float s,它仍然是两个obj实例,因为我只使用两种不同的类型?

回答

18

对于每个不同的模板初始化,静态成员都不相同。这是因为每次模板初始化都是由编译器在遇到该模板的特定初始化时第一次生成的不同类。

静态成员变量是不同的,通过这个代码中显示的事实:

#include <iostream> 

template <class T> class Foo { 
    public: 
    static int bar; 
}; 

template <class T> 
int Foo<T>::bar; 

int main(int argc, char* argv[]) { 
    Foo<int>::bar = 1; 
    Foo<char>::bar = 2; 

    std::cout << Foo<int>::bar << "," << Foo<char>::bar; 
} 

导致

1,2 
+0

“不同”? ;) – jamesdlin 2010-02-08 11:15:06

+0

由于问题是关于静态成员的,因此如果示例程序没有创建任何Foo 实例,则该示例程序会更清晰。而不是分配和打印出bar1.s,您可以使用Foo :: s代替。 – 2010-02-08 12:18:36

+0

@jamesdlin Ug。固定。我不应该试图翻转句子中的逻辑,然后不能正确地证明阅读。 – Yacoby 2010-02-08 13:22:05

3

有因为有课之多静态成员变量,这同样适用到模板。每个模板类的独立实例只创建一个静态成员变量。这些模板类的对象数量是无关紧要的。

4

A<int>A<float>是两种完全不同的类型,您不能安全地在它们之间进行投射。但是,两个A<int>实例将共享相同的静态myObject。

+0

谢谢,这是短暂的,但清除了我需要知道的一切:) – user240137 2010-02-08 10:59:02

1

在C++模板实际上是类的副本。我想在你的例子中,每个模板实例会有一个静态实例。

+1

“C++模板实际上是类的副本”:这是没有道理的。 0)还有模板函数和模板成员函数,1)定义“复制”。我猜你的意思是每个类模板实例化代表一个新的类类型。 – 2010-02-08 13:43:08

+0

是的,与Java不同,C++在内部使类的副本与填充的模板部分相匹配。 – Thirler 2010-02-08 13:59:45

相关问题