我正在学习自动模板推导guid:https://en.cppreference.com/w/cpp/language/class_template_argument_deduction。因此,我想尝试一下。
我具有以下嵌套的类结构,其中MyClass
是具有非模板参数的模板化类,内部结构MyStruct
仅具有std::array<int, N>
。
我有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>;
我想这样实现或构造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
真的很抱歉,如果这是我的愚蠢错误,可是编译器;他们应该表现不正确吗?
答案 0 :(得分:3)
您可以编写一个演绎指南,将brace-initializer-list参数视为这样的数组:
template<size_t N>
MyClass(int const (&)[N]) -> MyClass<N>;
然后您可以通过以下方式构造对象:
MyClass myObj{ { 1, 2} };
这里是demo。