c++ - 这个自动模板推导指南正确吗?

标签 c++ templates c++17

我正在学习自动模板推导guid:https://en.cppreference.com/w/cpp/language/class_template_argument_deduction 。因此我想尝试一下。

我有以下嵌套类结构,其中 MyClass是一个带有非模板参数的模板类,内部结构 MyStruct只需有一个 std::array<int, N> .

我有MyStruct mStruct;作为成员(member):

#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>;

我想像这样实现或构造 MyClass

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

因此我给出了如上的推导指导。

此代码在 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
  • 我是否正确完成了扣除指南?
  • 哪个编译器是正确的?

真的很抱歉,如果这是我的一个愚蠢的错误,但是编译器;他们不应该表现得正确吗?

最佳答案

您可以编写一个推导指南,将括号初始化列表参数视为一个数组,如下所示:

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

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

MyClass myObj{ { 1, 2} };

这是一个demo .

关于c++ - 这个自动模板推导指南正确吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63347138/

相关文章:

c++ - 在提示再次运行程序时尝试进行错误纠正

c++ - 模板类继承链接器错误

c++ - 使用包扩展的 Lambda 继承

c++ - 无法编译以下代码以访问结构的变体

c++ - uintX_t 和 intX_t 类型的打印保证

c++ - 检查 std::map 中是否存在 - 计数与查找

c++ - CUDA中数据数组和指向数据指针的共享内存的动态分配

c++ - 具有大量输入和输出的人工神经网络

c++ - 我应该如何使我的分配器可重新绑定(bind)?我可以在保持其字段私有(private)的同时做到这一点吗?

wpf - TemplateBinding 不绑定(bind)到效果的属性?