2012-03-14 28 views
0

可能重复:
C++ invoke explicit template constructor如何选择构造模板?

首先想象我有一个模板成员函数的类数据: -

class Data 
{ 
public: 
    template <class Loader> void load(const std::string& filename); 
}; 

我可以用这这样的 -

Data data; 
data.load<SomeLoader>(filename); 

和一切正常。我可以在编译器时通过模板参数选择哪个类,我希望我的Data对象用来加载一些数据。

但是我不能工作,如何与构造函数做到这一点...

class Data 
{ 
public: 
    template <class Loader> Data(const std::string& filename); 
}; 

这似乎编译得很好,但我似乎无法找出如何实际调用该函数。

Data<SomeLoader> data; 

这不起作用,因为它会调用类模板,而不是模板构造函数。

有一些我在这里失踪的语法吗? (如果我添加SomeLoader类型的构造函数参数,那么编译器会正确推断出要使用的类,但这不是我需要在这里做的)

+0

啊,我搜索了这个,但没有找到任何东西。感谢您添加链接 – jcoder 2012-03-14 12:25:46

回答

2

您不缺少任何语法。显式使用构造函数模板的专门化是不可能的。

标准具有[temp.arg.explicit]/7关于此的注解:

由于显式模板参数列表如下函数模板名称,因为CON组版本的成员函数模板和构造成员函数模板被称为不使用函数名称,因此无法为这些函数模板提供显式模板参数列表。

+0

您能否提供一些相关文档? – 2012-03-14 12:02:22

+1

@Luchian几乎没有。在标准中没有一段说“没有语法来调用具有显式模板实例化的构造函数”(顺便说一下,你*可以*使用placement new来做到这一点,但是让我们不要去那里......)**编辑**哦。显然标准*确实*提供了明确的措词。太体贴了。看到重复。 – 2012-03-14 12:12:08

+0

@KonradRudolph:啊,就在那里,我知道我在某个地方见过。 – Mankarse 2012-03-14 12:16:32

0

这是不可能的,因为编译器无法推断出类型,也无法将它传递给构造函数。

一些可能的解决方案:
1.使数据类模板
2.通过一些参数构造函数。这可能是使用依赖注入并将加载器传递给构造函数的更好解决方案。