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++11 - Fatal编程技术网

C++ 为什么这个变量函数调用不明确?

C++ 为什么这个变量函数调用不明确?,c++,c++11,C++,C++11,为什么这个函数调用不明确?我想把它叫做组件屏蔽 当使用一个typename调用组件_impl时,它是不明确的。第一个版本与空的typename包匹配。第二个版本也是匹配的 将可变模板版本更改为在typename包之前有两个typename。这将消除这两个功能的歧义 error: call to member function 'component_impl' is ambiguous return component_impl<FilterComponents...>(b);

为什么这个函数调用不明确?我想把它叫做组件屏蔽

当使用一个typename调用组件_impl时,它是不明确的。第一个版本与空的typename包匹配。第二个版本也是匹配的

将可变模板版本更改为在typename包之前有两个typename。这将消除这两个功能的歧义

error: call to member function 'component_impl' is ambiguous
    return component_impl<FilterComponents...>(b);
当过滤器组件。。。如果为空或只有一个元素,则存在歧义,因为两个函数模板都是同样可行的。您可以向第一个模板声明中添加第二个模板参数,以解决模棱两可的问题。您还可以将参数解压缩到初始值设定项列表中,以获得相同的效果:

样板 std::位集组件\u implst::位集&b { 使用discard=int[]; voiddiscard{0,b.setFilterComponents::get,void,0…}; 返回b; } 第一个0和后面的0用于补偿空参数包,并用整数填充列表,从而丢弃void类型。void会删除set的返回值,从而防止可能使用重载运算符,因为我们知道std::bitset::set的返回类型没有重载运算符,但在处理一般情况时,使用重载运算符会很有帮助


这也消除了第二次重载以帮助递归的需要。

Testcase请。。。。。。为什么每个问题我都要问一个测试用例?为什么理解它的重要性如此困难?为什么在发布到互联网之前没有人构建它们?!噢@LightnessRacesinOrbit好的,请稍等。当FilterComponents只有一个元素时,两个函数模板都可以使用完全相同的模板参数进行实例化。@0x499602D2谢谢,这很有意义。@LightnessRacesinOrbit:这就是为什么问题应该包含完整的错误消息。当然,从完整的信息来看,这个问题可能是不必要的。IDE提供了一个错误列表窗口,可以在第一次换行时截断错误信息,这对IDE造成了极大的危害。我想它完全不需要单独的帮助函数。这是一个很好的解决方案。对0和void的解释不会出错!第一个0应该在包扩展之外。您取出的void在这里确实是不必要的,但这是一个很好的一般提示,我认为您能包括其中是很好的:它确保使用内置的,无论b.set是如何声明的,因为没有自定义运算符可以接受void类型的参数。这里不需要它,因为已知b.set的返回类型没有任何重载运算符,但如果将此答案扩展为调用返回其他类型的其他方法,则它将非常有用。@hvd谢谢,我将把它添加回。
error: call to member function 'component_impl' is ambiguous
    return component_impl<FilterComponents...>(b);
template<typename FilterComponent1, typename FilterComponent2, typename ...FilterComponents>
std::bitset<components_count> component_impl(std::bitset<components_count> &b){
   b.set(FilterComponent1::get_id());
   return component_impl<FilterComponent2, FilterComponents...>(b);
}