C ++可变参数模板:无法匹配函数

伊夫

这是我的代码:

#include <iostream>
#include "Generator.h" // user-defined class

char getChar(Generator & generator)
{
    return generator.generateChar();
}

char getChar(int pos, const string & s)
{
    return s[pos];
}

template<typename... StringType>
void func(Generator & generator, StringType &&... str)
{
    char ch;
    int size = sizeof...(StringType);
    // lots of things to do
    if (size == 0)
    {
        ch = getChar(generator);
    }
    else
    {
        ch = getChar(1, std::forward<StringType>(str)...); // ERROR here
    }
}

int main(int argc, char ** argv)
{
    Generator generator;

    func(generator);
    func(generator, "abc");

    return 0;
}

一开始,我只是重载了函数,func然后发现有很多类似的代码。因此,我正在考虑使用可变参数模板来获得更好的设计。如果两个重载函数相似,如何进行更好的设计

但是我不知道为什么会出现错误:

main.cpp:27:8:错误:调用'getChar'时没有匹配函数ch = getChar(1,std :: forward(str)...);

main.cpp:37:2:注意:在实例化功能模板特化功能'func <>'时,此处要求
func(generator);

main.cpp:6:6:注意:候选函数不可行:对于第一个参数char
getChar(Generator&generator),没有从'int'到'Generator&'的已知转换

main.cpp:11:6:注意:候选函数不可行:需要2个参数,但是提供了1个char getChar(int pos,const string&s)



顺便说一句,我可以有一些设计,避免使用if...else...有工作sizeof...(StringType)

山姆·瓦尔沙夫奇克

当模板被扩展时,整个模板代码将被完整地扩展和编译。

让我们看看这里发生了什么:

func(generator);

在结果模板生成的函数中,size将为0,并且结果函数变为:

if (0 == 0)
{
    ch = getChar(generator);
}
else
{
    ch = getChar(1);
}

您的编译错误非常明显:getchar(1);与的任何重载实例都不匹配getChar()if语句将始终评估为true,并且该else部分永远不会执行的事实无关紧要。else部分必须仍然是有效的C ++代码,并且必须进行编译,并且只有在编译后才能被优化(也许)。而且它无法编译,因此出现编译错误。

现在可以回答您的问题“我不知道为什么会出错”。现在你知道了。如何解决此问题成为一个不同的问题,答案取决于具体情况,模板专业化和/或SFINAE的某种组合。

您的问题中的示例似乎是一个简化的示例(因为如果参数包具有两个或多个参数,显然模板函数将永远无法工作)。很好(并且100%符合显示最小,完整,可验证示例的精神),但是想出所显示代码的替代可编译版本可能不会回答您的真正问题。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章