当前位置: 首页 > 知识库问答 >
问题:

此自动模板推导是否正确?

阴禄
2023-03-14

我正在学习自动模板演绎guid:https://en.cppreference.com/w/cpp/language/class_template_argument_deduction.因此我想试试这个。

我有以下嵌套类结构,其中MyClass是一个带有非模板参数的模板化类,内部结构MyStruct只是有一个

我有< code > MyStruct mStruct作为会员:

#include <iostream>
#include <array>

template<size_t N>
class MyClass
{
public:
   struct MyStruct
   {
      using ArrayType = std::array<int, N>;
      ArrayType arr;
   };
   MyStruct mStruct;

   MyClass(typename MyStruct::ArrayType const& arr)
      : mStruct{ arr }
   {}
};
// deduction guid
template<size_t N>
MyClass(typename MyClass<N>::MyStruct::ArrayType)->MyClass<N>;

我想像这样实现或构建My类

 MyClass myObj{ typename MyClass<2>::MyStruct::ArrayType{ 1, 2} };

因此我给出了如上的演绎guid。

此代码在 MSVC 2019 中工作:https://godbolt.org/z/7PzzbM

然后想看看其他GCC和Clang的编译器。但他们不接受我的代码:https://godbolt.org/z/M8cPKj

错误:

source > : In function 'int main()' :
   <source> : 25 : 67 : error : class template argument deduction failed :
25 | MyClass myObj{ typename MyClass<2>::MyStruct::ArrayType{ 1, 2} };
| ^
<source>:25 : 67 : error : no matching function for call to 'MyClass(MyClass<2>::MyStruct::ArrayType)'
< source > : 15 : 4 : note : candidate : 'template<long unsigned int N> MyClass(const typename MyClass<N>::MyStruct::ArrayType&)-> MyClass<N>'
15 | MyClass(typename MyStruct::ArrayType const& arr)
| ^ ~~~~~~
<source> : 15 : 4 : note : template argument deduction / substitution failed :
<source> : 25 : 67 : note : couldn't deduce template parameter 'N'
25 | MyClass myObj{ typename MyClass<2>::MyStruct::ArrayType{ 1, 2} };
| ^
<source>:5 : 7 : note : candidate : 'template<long unsigned int N> MyClass(MyClass<N>)-> MyClass<N>'
5 | class MyClass
| ^ ~~~~~~
<source> :5 : 7 : note : template argument deduction / substitution failed :
<source> : 25 : 67 : note : 'std::array<int, 2>' is not derived from 'MyClass<N>'
25 | MyClass myObj{ typename MyClass<2>::MyStruct::ArrayType{ 1, 2} };
| ^
<source>:21 : 1 : note : candidate : 'template<long unsigned int N> MyClass(typename MyClass<N>::MyStruct::ArrayType)-> MyClass<N>'
21 | MyClass(typename MyClass<N>::MyStruct::ArrayType)->MyClass<N>;
| ^ ~~~~~~
<source>:21 : 1 : note : template argument deduction / substitution failed :
<source> : 25 : 67 : note : couldn't deduce template parameter 'N'
25 | MyClass myObj{ typename MyClass<2>::MyStruct::ArrayType{ 1, 2} };
| ^
ASM generation compiler returned : 1
  • 我是否正确完成了演绎指南?
  • 哪个编译器是正确的?

真的很抱歉,如果这是我的一个愚蠢的错误,但编译器;难道他们不应该举止端正吗?

共有1个答案

安建木
2023-03-14

您可以编写一个演绎指南,将大括号初始值设定项列表参数视为数组,如下所示:

template<size_t N>
MyClass(int const (&)[N]) -> MyClass<N>;

然后你可以这样构造一个对象:

MyClass myObj{ { 1, 2} };

这里有一个演示。

 类似资料:
  • 另一个有用的可能示例:(伪代码)

  • 我正在尝试编写一个简单的模板,我可以使用该模板对带有单个参数的函数进行记忆: 但我得到了一个错误: 错误:没有匹配函数来调用“备忘录(双精度)” 注:候选人是: 注意:模板OUT记忆(IN) 注意:模板参数扣除/替换失败: 为什么编译失败? 实际上,当我指定所有模板参数时,我不明白为什么模板参数推导/替换会发生。 我使用的是gcc版本4.7.2(未启用C 11) PS:模板的错误比我最初意识到的要

  • 阅读C 11标准,我无法完全理解以下陈述的含义。榜样是非常受欢迎的。 两组类型用于确定偏序。对于涉及的每个模板,都有原始函数类型和转换后的函数类型。[注:转换类型的创建在14.5.6.2.-结束注]演绎过程使用转换类型作为参数模板,另一个模板的原始类型作为参数模板。对于偏序比较中涉及的每种类型,此过程执行两次:一次使用转换后的模板-1作为参数模板,模板-2作为参数模板,再次使用转换后的模板-2作为

  • 我有以下代码: 使用这段代码,我希望第一次调用打印出(因为确实可以转换为,所以应该调用第一个专门化),第二次调用打印出(不能转换为,所以应该调用第二个专门化)。但是,我反而得到了一个编译器错误: prog.cpp:在函数“int main()”中: prog.cpp:5:6:注意:模板参数扣减/替换失败: prog.cpp:27:8:注意:无法推导出模板参数“[Anonymous>” 但是,如果我

  • 对于以下代码: C++14编译器产生错误: 我很好奇为什么模板参数推导在这里不起作用。似乎,假定g的参数是int类型,我们可以推断f的参数是类型,因此f中的。为什么没有发生这种情况?我对C++标准中解释这一点的相关部分很感兴趣。T是否出现在这里的非推导上下文中? 因此,创建非推导上下文的不是尖括号。

  • 如果你在 <script> 标签中编写模板,并且设置了特定的属性,那么 Framework7 会自动帮你编译所有的模板: <script type="text/template7" id="myTemplate"> <p>Hello, my name is {{name}} and i am {{age}} years old</p> </script> 其中: type="text/t