这是我的代码:
static
一开始我刚刚重载了函数constexpr
,我发现有许多相似的代码。所以我考虑使用可变参数模板来获得更好的设计。 (How to make a better design if two overload functions are similar)
但我不知道为什么会出现错误:
main.cpp:27:8:错误:没有匹配函数来调用' getChar' ch = getChar(1,std :: forward(str)...);
main.cpp:37:2:注意:在实例化功能模板专业化' func<>'这里要求
FUNC(发电机);
main.cpp:6:6:注意:候选功能不可行:没有来自' int'到'发电机'第一个参数char
getChar(发电机和发电机)
main.cpp:11:6:注意:候选函数不可行:需要2个参数,但是1提供了char getChar(int pos,const string& s)
顺便说一下,我可以设计一些设计以避免使用#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
吗?
答案 0 :(得分:1)
展开模板后, 整个 模板代码将完整展开并进行编译。
让我们看看这里发生了什么:
func(generator);
在生成的模板生成的函数中,size
将为0,结果函数变为:
if (0 == 0)
{
ch = getChar(generator);
}
else
{
ch = getChar(1);
}
您的编译错误变得非常明显:getchar(1);
与getChar()
的任何重载实例都不匹配。 if
语句将始终评估为true,而else
部分永远不会被执行的事实并不重要。 else
部分必须仍然是有效的C ++代码,它被编译,并且只有在编译之后才会被优化掉(可能)。它无法编译,因此编译错误。
现在回答你的问题&#34;我不知道为什么会出现错误&#34;。现在你知道了。如何解决这个问题成为一个不同的问题,答案是,根据具体情况,模板专业化和/或SFINAE的某种组合。
看起来您的问题中的示例是一个缩写示例(因为模板函数永远不会工作,显然,如果参数包有两个或更多参数)。这很好(并且100%符合显示最小,完整,可验证的示例的精神),但提出所示代码的替代可编译版本可能无法回答您的真实问题。