模板特化中的默认参数参数
Default argument parameter in template specialization
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>
,但是它的body现在已经无关紧要了。
函数指针不能使用默认参数。此外,函数的默认值应分配给参数类型的参数。
template<int> void printf_t(const int& a, char n= '\n')
{
//implementation
}
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);
}
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>
,但是它的body现在已经无关紧要了。
函数指针不能使用默认参数。此外,函数的默认值应分配给参数类型的参数。
template<int> void printf_t(const int& a, char n= '\n')
{
//implementation
}
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);
}