template<typename T> void printf_t(const T&, char='\n');
template<> void printf_t(const int&, char);
void (*pi)(const int&, char) = printf_t<int>;
int main()
{
int a;
scanf("%d", &a);
pi(a);
return 0;
}
我怎样才能使这段代码工作呢? 我希望在这个模板
专门化中有char参数默认值,但是编译器说调用函数pi
的参数太少(它需要char
)。 下面的代码也会给出错误:
template<typename T> void printf_t(const T&, char);
template<> void printf_t(const int&, char='\n');
void (*pi)(const int&, char) = printf_t<int>;
int main()
{
int a;
scanf("%d", &a);
pi(a);
return 0;
}
错误:
g++ template.cpp -o template
template.cpp:55:54: error: default argument specified in explicit specialization [-fpermissive]
55 | template<> void printf_t(const int&, char='\n');
|
当然,我已经定义了printf_t
,但是它的主体现在已经不相关了。
我怎样才能使这段代码工作呢?
你不能。 函数指针不能采用默认参数。 但是,您可以通过将调用包装到函数或lambda中,或者使用std::bind
:
auto pi = std::bind(printf_t<int>, std::placeholders::_1, '\n');
pi(a);
使用lambda:
auto pi = [](const int& a) {
printf_t<int>(a);
};
pi(a);
只是将其包装到函数调用中:
void pi(const int& a)
{
printf_t<int>(a);
}
不能使用函数指针的默认参数。 此外,函数的默认值应该分配给参数,参数的类型不应该是。
template<int> void printf_t(const int& a, char n= '\n')
{
//implementation
}