类的成员函数,带有模板参数和类外部的默认参数

时间:2019-08-16 17:41:12

标签: c++ function class templates definition

我要在模板类之外定义函数,如下所述。

已经为第二个参数(它是模板,也采用默认参数)尝试了很多组合。

template <typename T>
class CustomAllocator
{
 //My custom allocator
};

template <typename T, typename Allocator = CustomAllocator<T> >
class CustomContainer
{
 void push_back();
};

/*I want to define push_back outside my class, tried everything.
Almost 4 hours spent through stackoverflow, fluentcpp and all sites*/

// What should be specified for Allocator here ?
template <typename T>
void CustomContainer<T,Allocator>::push_back(T value)
{

}

//OR

template <typename T>
void CustomContainer<T,CustomAllocator<> >::push_back(T value)
{

}

我希望它可以在课外定义 实际出现编译器错误,如果是简单类型,我可以在第二个参数中轻松提及int,float等。

2 个答案:

答案 0 :(得分:4)

在类定义之外,函数尚不清楚Allocator是什么类型,因此必须像重新声明T

一样重新声明它
template <class T, class Allocator>
void CustomContainer<T,Allocator>::push_back(T value)
{
   // ...
}

(我假设DataType应该是T

请注意,您在类中的push_back声明应符合以下定义:

template <typename T, typename Allocator = CustomAllocator<T> >
class CustomContainer
{
 void push_back(T);
};

答案 1 :(得分:2)

对于模板定义之外定义的模板的成员函数,不得使用默认模板参数。

根据C ++ 17 Standard(17.1模板参数)

  
      
  1. ...不得在模板中指定默认模板参数-   类成员定义的参数列表   出现在会员课程之外的模板。
  2.   

所以只要写

template <typename T, typename Allocator>
void CustomContainer<T, Allocator>::push_back( const T &value )
{
    //...
}

请注意函数的参数。您对函数的声明与它的定义不符。