好的,简单的模板问题.假设我像这样定义我的模板类:
template类 foo {上市:foo(T const& first, T const& second) : first(first), second(second) {}模板void bar(C& 容器,T const& baz){//...}私人的:第一;T秒;}
问题是关于我的 bar 函数...我需要它能够使用某种标准容器,这就是为什么我包含模板/类型名称 C 部分来定义该容器类型.但显然这不是正确的方法,因为我的测试班然后抱怨:
错误:'bar' 未在此范围内声明
那么我将如何以正确的方式实现我的栏功能?也就是说,作为我的模板类的一个函数,具有任意容器类型......我的模板类的其余部分工作正常(具有不会导致错误的其他函数),这只是一个有问题的函数.
好的,所以特定函数(bar)是一个 eraseInRange 函数,它擦除指定范围内的所有元素:
void eraseInRange(C& container, T const& firstElement, T const& secondElement) {...}
一个如何使用它的例子是:
eraseInRange(v, 7, 19);
在这种情况下,v 是一个向量.
编辑 2:傻我!我应该在我的班级之外声明这个函数,而不是在里面……这是一个非常令人沮丧的错误.无论如何,感谢大家的帮助,虽然问题有点不同,但这些信息确实帮助我构建了函数,因为在找到我原来的问题后,我确实遇到了其他一些令人愉快的错误.所以谢谢你!
概括不要超过需要,不要少于.
在某些情况下,该解决方案可能还不够,因为它会匹配具有此类签名的任何模板(例如 shared_ptr
),在这种情况下,您可以使用 type_traits
,非常像 duck-typing(模板通常是鸭式的).
#include //Helper 判断是否有一个用于 T 的 const_iterator.模板结构 has_const_iterator{私人的:模板静态字符测试(类型名 C::const_iterator*);模板静态整数测试(...);上市:枚举 { value = sizeof(test(0)) == sizeof(char) };};//bar() 是为也定义了 const_iterator 的容器定义的//作为 value_type.模板 typename std::enable_if::value,无效>::类型bar(const Container &c, typename Container::value_type const & t){//注意:不需要对 value_type 进行额外检查,检查是为了//已经在函数签名中释放了.}模板 类DoesNotHaveConstIterator {};#include <向量>int主(){std::vectorC;酒吧 (c, 1.2f);DoesNotHaveConstIterator乙;酒吧 (b, 1.2f);//正确编译失败}
一个好的模板通常不会人为地限制它们有效的类型(为什么要?).但是想象一下,在上面的示例中,您需要访问对象 const_iterator
,然后您可以使用 SFINAE 和 type_traits 将这些约束放在您的函数上.
概括不要超过需要,不要少于.
template void bar (Iter it, Iter end) {for (; it!=end; ++it) {/*...*