提问者:小点点

模板专用化中的默认实参参数[重复]


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,但是它的主体现在已经不相关了。


共2个答案

匿名用户

我怎样才能使这段代码工作呢?

你不能。 函数指针不能采用默认参数。 但是,您可以通过将调用包装到函数或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
}