Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.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_C++20_Template Argument Deduction - Fatal编程技术网

C++ C++;非类型模板参数中的类类型:扣减指南失败 问题

C++ C++;非类型模板参数中的类类型:扣减指南失败 问题,c++,templates,c++20,template-argument-deduction,C++,Templates,C++20,Template Argument Deduction,我使用的是c++2a特性,它允许structs/std::array作为模板参数(g++-9.2.0,在clang中还不支持)。 该功能在非类型模板参数中称为类类型,并在P0732R2中提出 我尝试使用一个类的模板参数(在下面的示例中为structC),以推导第二个类的相应类模板参数(在下面的示例中为structB)。我在此使用我为此目的编写的自定义类模板参数推断指南 在这个最小的示例中,我要提取的信息是两个ints。 如果我使用这些基本类型作为模板参数,一切都会正常工作。但是,当我将信息合并到

我使用的是c++2a特性,它允许structs/std::array作为模板参数(
g++-9.2.0
,在
clang
中还不支持)。 该功能在非类型模板参数中称为
类类型
,并在
P0732R2
中提出

我尝试使用一个类的模板参数(在下面的示例中为struct
C
),以推导第二个类的相应类模板参数(在下面的示例中为struct
B
)。我在此使用我为此目的编写的自定义类模板参数推断指南

在这个最小的示例中,我要提取的信息是两个
int
s。 如果我使用这些基本类型作为模板参数,一切都会正常工作。但是,当我将信息合并到一个
std::pair
或一个自定义
std::struct
中时,推断失败

代码 分离信息 下面的代码工作得很好

#包括
///数据结构,其中包含稍后用于类型推断的constexpr上下文
模板结构C{};
///类,它必须找到自己的类型
模板结构B{
模板显式B(C…C){}
};
///课程扣减指引
模板B(C…C)
->B;
int main(){bk{C{},C{};}
组合信息 下面的代码无法编译

#include <array>

/// Change: A contains the information from the previous example in a structs.
struct A { int a; int b; };

/// Data structure which contains a constexpr context to be used for type deduction later
template <A a> struct C {};

/// Class which has to find out its own type
template <std::size_t count, std::array<A, count> a> struct B {
  template <A... af> explicit B(C<af> ... c) {}
};

/// Class deduction guide
template <A... af> B(C<af>... c)->B<sizeof...(af) + 1, std::array<A, sizeof...(af) + 1>{af...}>;

int main() { B k{C<A{1, 2}>{}, C<A{2, 3}>{}}; }
#包括
///变更:在结构中包含上一个示例中的信息。
结构A{intA;intB;};
///数据结构,其中包含稍后用于类型推断的constexpr上下文
模板结构C{};
///类,它必须找到自己的类型
模板结构B{
模板显式B(C…C){}
};
///课程扣减指引
模板B(C…C)->B;
int main(){bk{C{},C{};}
错误输出:


main.cc:在函数“int main()”中:
main.cc:24:14:错误:类模板参数扣除失败:
24 | B k{c1,c2};
|              ^
main.cc:24:14:错误:对“B(C&,C&)”的调用没有匹配的函数
main.cc:17:20:注:候选者:“B(C…)->B[带A…af={}”
17 |模板B(C…C)->B;
|                    ^
main.cc:17:20:注意:候选者需要0个参数,提供2个参数
main.cc:14:31:注:候选者:“模板B(C…)->B”
14 |模板显式B(C…C){
|                               ^
main.cc:14:31:注意:模板参数扣除/替换失败:
main.cc:24:14:注意:无法推断模板参数“count”
24 | B k{c1,c2};
我现在想知道是什么导致了这个问题。发生错误的原因是什么

  • 。。。总的来说,我想要达到的目标是不可能的
  • 。。。有些东西还没有在g中实现++
  • 。。。我搞砸了我的扣除指南

我也不明白错误信息。看起来函数应该没有参数。问题是
C..
无法在构造函数中展开吗?

@AndiG和@walnut用他们对我原始问题的评论回答了我的问题


我的问题可能是由我的
G++-9
版本中的错误引起的。我目前没有使用最新版本的
g++-9
,这个错误至少在g++-10中得到了解决。在编译的
g++-10.0
I版本(
3684bbb022c
)中,我不再收到错误

@AndiG和@walnut回答了我的问题,并对我最初的问题发表了评论


我的问题可能是由我的
G++-9
版本中的错误引起的。我目前没有使用最新版本的
g++-9
,这个错误至少在g++-10中得到了解决。在编译的
g++-10.0
I版本(
3684bbb022c
)中,我不再收到错误

您是使用
-std=c++2a
编译的吗?对于me@AndyG但它不适用于GCC 9.2.0,只适用于head。OP:这似乎是一个很好的指标,表明它只是以前版本中的一个bug。是的,我是用
g++-std=c++2a-fno严格别名-fwrapv-save temps main.cc
编译的,但是
g++-std=c++2a main.cc
对我也不起作用。但是我会检查它是否适用于我的g++10。非常感谢,我还没有尝试过,你是对的,它适用于更新版本的g++:)我是StackOverflow新手;我能接受你的答案吗/投赞成票,因为切换到更新版本的g++对我很有用,并且解决了这个问题。不过我还有一个问题:如果你是我,你会向GNU bug追踪器报告这个问题吗?因为这个问题在最近的版本中似乎可以解决,所以这个问题似乎已经解决了。我认为,如果这个错误在更新的版本中已经修复,你不应该向错误跟踪者报告它。如果有人决定从这些评论中写出一个真实的答案,你可以接受(一旦你有了足够的声誉,你就可以投票)。你也可以自己写一个答案。你是用
-std=c++2a
编译的吗?对于me@AndyG但它不适用于GCC 9.2.0,只适用于head。OP:这似乎是一个很好的指标,表明它只是以前版本中的一个bug。是的,我是用
g++-std=c++2a-fno严格别名-fwrapv-save temps main.cc
编译的,但是
g++-std=c++2a main.cc
对我也不起作用。但是我会检查它是否适用于我的g++10。非常感谢,我还没有尝试过,你是对的,它适用于更新版本的g++:)我是StackOverflow新手;我能接受你的答案吗/投赞成票,因为切换到更新版本的g++对我很有用,并且解决了这个问题。不过我还有一个问题:如果你是我,你会向GNU bug追踪器报告这个问题吗?因为这个问题在最近的版本中似乎可以解决,所以这个问题似乎已经解决了。我认为,如果这个错误在更新的版本中已经修复,你不应该向错误跟踪者报告它。你可以做一个