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;
}
我怎样才能让这段代码工作?我想在这个 template<int>
中有 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<int>
,但现在它的主体已经无关紧要了。
最佳答案
How can I make this code work ?
你不能。函数指针不能采用默认参数。不过,您可以通过将调用包装到函数或 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);
}
关于c++ - 模板特化中的默认实参参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62728802/