当前位置: 首页 > 知识库问答 >
问题:

具有模板参数和类外默认参数的类的成员函数

祁晟
2023-03-14

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

已经为第二个参数尝试了很多组合,它是一个模板,并且也接受默认参数。

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、浮动等。

共有2个答案

温成济
2023-03-14

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

来自C 17标准(17.1模板参数)

那就写吧

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

注意函数的参数。您对函数的声明与其定义不一致。

籍英叡
2023-03-14

在类定义之外,函数不清楚分配器是什么类型,因此必须重新声明它,就像重新声明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个默认值的参数的模板,并为其指定一个值? 有人能引用标准吗?

  • 是否允许在友元声明中为模板参数提供默认值? Visual Studio 2015似乎允许这样做。gcc拒绝了。我在cppreference页面上找不到任何内容。

  • 我试图理解下面的代码片段 当使用指针类型示例int*调用时,默认参数是如何工作的? 当obj1.test()被调用时,编译器将生成什么。我得到一个编译器错误当我尝试

  • 我有一个模板化的C++类,它也有一个模板化的成员函数。这个成员函数的模板参数以特定的方式依赖于类的模板参数(请参阅下面的代码)。我正在为其模板参数的两个不同值实例化(而不是专门化)该类。一切都在这一点上进行。但是,如果我调用模板化的成员函数,对第一个实例化对象的调用只会编译,而不会编译第二个。似乎编译器没有为模板类的第二次实例化实例化模板化成员函数。我正在使用“g++filename.cpp”编译

  • 如果允许我执行以下操作: 为什么我主要不被允许做以下事情? 但我必须具体说明以下几点: C11引入了默认的模板参数,现在我完全无法理解它们。

  • 编译良好:gcc Version4.8.5(Ubuntu4.8.5-2Ubuntu1~14.04.1) 结果出现错误:clang Version3.4-1Ubuntu3(TAGS/RELEASE_34/FINAL)(基于LLVM 3.4)