为什么模板类型的初始化需要重复变量的类型?

问题描述:

假设我有一个具有某个模板类型的成员变量的对象。所以,在类的声明,就不会有这样的事情:为什么模板类型的初始化需要重复变量的类型?

// This is just the declaration of bar which is a member of some class. 
templatizedType<Foo> bar; 

现在,当我想初始化bar为什么我要做

// This is the initialization. Note that I am assuming that templatizedType has a 
// constructor that takes an argument of type T*. Presumably, this is happening 
// somewhere inside whatever class has declared bar as a member. 
templatizedType<Foo> bar(new Foo()); 

,而不是简单地

bar(new Foo()); 

编辑(试图澄清):从本质上讲,在我看来,酒吧的类型(包括参数化类型)已经在它的声明中作为类的成员进行了拼写因此在初始化时不需要重复。

如果这一切都没有意义,让我知道(我发现这主要是通过反复试验和对IRC有帮助的人,所以如果我对这里发生的事情的理解是错误的,那么帮助也会不胜感激。)

+0

是“酒吧”的一类或哪方面你一个成员变量申报和使用吧? – 2009-11-02 19:54:47

+1

这绝对是错的 - 你不应该重复变量声明。粘贴一个完整的样本。 – 2009-11-02 19:54:55

+0

你的意思是在这里说'TemplatizedType '有一个构造函数,它把'T *'作为参数,并且你想从参数中推导出'T'来传递给构造函数? – 2009-11-02 20:01:12

templatizedType<Foo> bar; 

调用默认的构造函数,而

templatizedType<Foo> bar(new Foo()); 

调用构造采取一个Foo *作为第一个参数 要构造一个对象,你写的类型。 这就是为什么,

bar(new Foo()) 

不叫templatizedType的构造函数,而是调用类型的已构建对象的方法。这种方法可能是,例如:

void operator()(Foo*) 

希望这有助于..

由于C++是一种强类型语言,它要确保你指的是真正的这个“吧”的事情是什么可以接受“新的Foo()”因此,你需要给它一个类型,如行:

templatizedType<Foo> bar(new Foo()); 

此外,如果你只是说

bar(new Foo()); 

谁会说这不是一个函数bar()vs变量声明?

你确定你不只是超载名称bar在你的构造,即如果你的类被称为A一个局部变量,你做的

A::A() 
    : bar(new Foo()) 
{ 
} 

A::A() 
{ 
    templatizedType<Foo> bar(new Foo()); 
} 

代替原因在于,解决模板化函数的重载问题已经很难了,而不需要处理部分专业化和模板模板成员的问题(我知道这听起来很混乱,令人困惑。)

基本上,确定当你有这个叫什么:

void foo (int i); 
template <typename T> void foo (T t); 

比搞清楚轻松了许多,当你有这个叫什么:

template <typename T> class foo { 
    foo (T t); 
    template <typename U> foo (U u); 
}; 

对构造的可能性是对于功能模板来说,通过一些启发式方法来解决问题的能力太大了,所以标准根本不会尝试(在我看来这是正确的调用)。相反,模板化类型可以提供make_****函数(想象中的make_pair),它们用作模板构造函数。

我认为最好你能希望有一个声明,如

TemplatizedType<> bar(new Foo()); 

但这种推论是不会发生的。我想最大的原因是编译器首先需要知道哪个TemplatizedType实例化,然后才能检查哪些构造函数。

用的C++ 0x,你将能够结合make_xxx函数推断与自动关键字模板参数:

auto bar = make_templatized_type(new Foo());