2010-05-18 90 views
26

类的构造函数可以是模板函数。在调用这样的构造函数的地方,编译器通常会查看赋给构造函数的参数,并从中确定使用的模板参数。是否还有一些语句可以明确指定模板参数?可以明确指定构造函数的模板参数吗?

一个人为的例子:

struct A { 
    template<typename T> 
    A() {} 
}; 

有没有办法来实例化这个类?显式指定构造函数的模板参数的语法是什么?

我的用例是一个问题,因为编译器似乎没有找到正确的模板构造函数。明确指定模板参数可能会生成更多有用的错误消息,甚至可以解决问题。

+1

为构造函数显式指定模板参数只能在构造函数的显式特化,实例化,行外定义和朋友声明中使用。 – 2013-06-07 08:51:26

+0

'模板 结构A {template A(){} };' - 适合我。但是,现在我们有模板课。 – bruziuz 2017-01-20 12:04:23

回答

32

号的C++标准03说:

[注:由于显式模板参数列表如下函数模板名称, 因为转换成员函数模板和构造成员函数模板被称为无使用函数名,也没有办法来提供这些功能模板的显式模板参数列表。](§14.5.2/ 5)

3

不,你不能使用该构造函数实例化那个类。但是:



struct A 
{ 
    template < typename T > 
    A(T const&); 
}; 

现在你可以。

+3

我不太明白答案......它与问题有什么关系? – 2010-05-18 23:22:58

+2

它显示了你如何做到这一点。只是碰巧你不能按照问题的方式去做。 – MSN 2010-05-18 23:41:27

+0

太糟糕的评论不能降级。那个很不“很棒”。 – 2010-05-18 23:42:19

8

还有就是模板构造为transfering类型信息的另一解决方案,它可以”把这种类型的价值看成是一种争论NT:

template<class T> 
struct id 
{}; 

struct A { 
    template<class T> 
    A(id<T>); 
}; 

A a=id<int>(); 

编辑:

请注意:A a(id<int>());不会起作用,因为最棘手的解析的。它将被解释为函数声明。进一步的解释请参见this question

相关问题