【发布时间】:2011-10-11 15:24:36
【问题描述】:
好的,简单的模板问题。假设我定义我的模板类是这样的:
template<typename T>
class foo {
public:
foo(T const& first, T const& second) : first(first), second(second) {}
template<typename C>
void bar(C& container, T const& baz) {
//...
}
private:
T first;
T second;
}
问题是关于我的 bar 函数...我需要它能够使用某种标准容器,这就是我包含模板/类型名称 C 部分的原因,以定义该容器类型。但显然这不是正确的做法,因为我的测试班然后抱怨:
错误:“bar”未在此范围内声明
那么我将如何以正确的方式实现我的 bar 功能?也就是说,作为我的模板类的函数,具有任意容器类型......我的模板类的其余部分工作正常(具有不会导致错误的其他函数),只是那个函数有问题。
编辑: 好的,所以具体的函数(bar)是一个eraseInRange函数,它擦除指定范围内的所有元素:
void eraseInRange(C& container, T const& firstElement, T const& secondElement) {...}
如何使用它的一个例子是:
eraseInRange(v, 7, 19);
这里的 v 是一个向量。
编辑 2: 傻我!我应该在我的班级之外声明这个函数,而不是在里面......这是一个非常令人沮丧的错误。无论如何,感谢大家的帮助,虽然问题有点不同,但信息确实帮助我构建了函数,因为在找到我原来的问题后,我确实得到了一些其他令人愉快的错误。所以谢谢你!
【问题讨论】:
-
请提供一个示例,说明您如何使用 foo
类和 foot ::bar 方法。问题可能出在您使用的代码中。 -
您发布的代码编译良好。您实际上在哪里遇到问题?
-
你的测试类没有发生 inherit from foo?见parashift.com/c++-faq-lite/templates.html#faq-35.19
-
我希望我的编辑能澄清一点?为练习提供了测试类,因此我不应该更改调用该方法的方式,但它抱怨没有声明 eraseInRange 方法...
-
由于我们不知道您的测试驱动程序在做什么,因此我们帮不上什么忙。该课程是否适合您,例如如果您自己使用
eraseInRange和矢量?
标签: c++ templates containers