Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;调用显式模板构造函数_C++_Templates - Fatal编程技术网

C++ C++;调用显式模板构造函数

C++ C++;调用显式模板构造函数,c++,templates,C++,Templates,您能告诉我如何显式调用模板构造函数(在初始值设定项列表中)吗? 例如: struct T { template<class> T(); }; struct U { U() : t<void>() {} //does not work T t; }; struct{ 模板T(); }; 结构单元{ U():t(){}//不工作 T; }; 谢谢,这是不可能的。本标准在14.8.1/7 [注意:由于显式模板参数列表紧跟在函数模板名称之后,并且由

您能告诉我如何显式调用模板构造函数(在初始值设定项列表中)吗? 例如:

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

struct U {
    U() : t<void>() {} //does not work
    T t;
};
struct{
模板T();
};
结构单元{
U():t(){}//不工作
T;
};

谢谢,这是不可能的。本标准在
14.8.1/7

[注意:由于显式模板参数列表紧跟在函数模板名称之后,并且由于调用转换成员函数模板和构造函数成员函数模板时未使用函数名称,因此无法为这些函数模板提供显式模板参数列表。]

解释:这表示:模板参数在函数模板名称后以尖括号传递,例如
std::make\u pair
。构造函数没有自己的名称,但它们在各种上下文中滥用它们的类名(因此
U()
的意思是:将
传递给类模板
U
,并通过调用没有参数的默认构造函数来构造对象)。因此,不能将模板参数传递给构造函数

在本例中,您试图在成员初始值设定项中传递模板参数。在这种情况下,问题就更大了:它将尝试将
t
解析并解释为基类类型,并认为您希望调用基类的默认构造函数。这当然会失败

如果你能接受它,你就可以解决它

struct T { 
    template<class U> T(identity<U>);
};

struct U {
    U() : t(identity<void>()) {}
    T t;
};

这是不可能的。本标准在
14.8.1/7

[注意:由于显式模板参数列表紧跟在函数模板名称之后,并且由于调用转换成员函数模板和构造函数成员函数模板时未使用函数名称,因此无法为这些函数模板提供显式模板参数列表。]

解释:这表示:模板参数在函数模板名称后以尖括号传递,例如
std::make\u pair
。构造函数没有自己的名称,但它们在各种上下文中滥用它们的类名(因此
U()
的意思是:将
传递给类模板
U
,并通过调用没有参数的默认构造函数来构造对象)。因此,不能将模板参数传递给构造函数

在本例中,您试图在成员初始值设定项中传递模板参数。在这种情况下,问题就更大了:它将尝试将
t
解析并解释为基类类型,并认为您希望调用基类的默认构造函数。这当然会失败

如果你能接受它,你就可以解决它

struct T { 
    template<class U> T(identity<U>);
};

struct U {
    U() : t(identity<void>()) {}
    T t;
};

@litb:你知道他们为什么不让你显式地调用t::t()?@Keith你可以指定让你感到困惑的地方,然后我们肯定可以澄清你对这个音符的理解。也许这就足够了:如果使用
T()
,那么
T
是结构
T
的名称,而不是构造函数的名称(它没有)。因此,如果你说
T()
,那么不管传递什么参数,都不会传递给构造函数,而是试图传递给struct,struct根本不是一个模板<代码>显式模板参数列表,
函数模板名称
转换成员函数模板
构造函数成员函数模板
。我几乎不懂那些抽象的术语(对不起,我无法抗拒双关语)。在再次阅读你的新评论和段落后,我可能会理解(尽管我仍然不知道术语)。我认为这是说
:t()
不起作用,因为模板词缀总是在类型名或函数名之后,而
t
两者都不是。是这样吗?(但是为什么不更改std以允许它呢?@Keith我已经为注释添加了一个解释。@Keith至于原因,我不知道,但可以猜测他们没有找到令人信服的用例。也许你可以为此提出一个新问题。@litb:你知道他们为什么不让你显式地调用t::t()?@Keith你可以指定让你感到困惑的地方,然后我们肯定可以澄清你对注释的理解。也许这就足够了:如果使用
T()
,那么
T
是结构
T
的名称,而不是构造函数的名称(它没有)。因此,如果你说
T()
,那么不管传递什么参数,都不会传递给构造函数,而是试图传递给struct,struct根本不是一个模板<代码>显式模板参数列表,
函数模板名称
转换成员函数模板
构造函数成员函数模板
。我几乎不懂那些抽象的术语(对不起,我无法抗拒双关语)。在再次阅读你的新评论和段落后,我可能会理解(尽管我仍然不知道术语)。我认为这是说
:t()
不起作用,因为模板词缀总是在类型名或函数名之后,而
t
两者都不是。是这样吗?(但是为什么不更改std以允许它呢?@Keith我已经为注释添加了一个解释。@Keith至于原因,我不知道,但可以猜测他们没有找到令人信服的用例。也许你可以为此提出一个新问题。