我想在模板类之外定义如下所述的函数。
已经为第二个参数尝试了很多组合,它是一个模板,并且也接受默认参数。
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、浮动等。
对于在模板定义之外定义的模板的成员函数,不能使用默认模板参数。
来自C 17标准(17.1模板参数)
那就写吧
template <typename T, typename Allocator>
void CustomContainer<T, Allocator>::push_back( const T &value )
{
//...
}
注意函数的参数。您对函数的声明与其定义不一致。
在类定义之外,函数不清楚分配器是什么类型,因此必须重新声明它,就像重新声明
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)