双重模板函数总是不匹配的问题
最近碰到个模板函数不能匹配的问题,总是不能解决,求大侠指点。。。
模板定义如下:
namespace analytical{ namespace elements { namespace dynamic_polymorphism { template <typename T> class curve; template <typename T> class curve { public: curve(const shape_base<T> *s) : _s(s) { } T area() const; void intersect_by(); void intersect_by(const curve<T> &c); const std::list<numerical::interval::linear<T> > &the_intervals() const { return _intervals; } friend std::ostream &operator<< <>(std::ostream &os, const curve &c); private: std::list<numerical::interval::linear<T> > _intervals; boost::shared_ptr<const shape_base<T> > _s; }; ... template <typename T, template <typename> class Container> T area(Container<curve<T> > &v) { typedef typename Container<curve<T> >::iterator iterator; for(iterator it = v.begin(); it != v.end(); ++ it) it->intersect_by(); for(iterator it = v.begin(); it != v.end(); ++ it) for(iterator it1 = it + 1; it1 != v.end(); ++ it1) { it1->intersect_by(*it); it->intersect_by(*it1); } T total_area = 0; for(iterator it = v.begin(); it != v.end(); ++ it) total_area += it->area(); return total_area; } } }}int main(){ ... std::vector<analytical::elements::dynamic_polymorphism::curve<double> > v; v.push_back(...); std::cout << area(v) << std::endl; ...}namespace analytical { namespace elements { namespace dynamic_polymorphism { // template <typename T> // class curve; template <typename T> class curve { public: typedef T value_type; curve() { } T area() const; void intersect_by(); void intersect_by(const curve<T> &c); friend std::ostream &operator<< <>(std::ostream &os, const curve &c); private: }; template<typename T> struct value_traits { typedef typename T::value_type res; }; template <typename Container> typename value_traits<typename Container::value_type>::res area(Container &v) { typedef typename Container::iterator iterator; typedef typename value_traits<typename Container::value_type>::res T; for(iterator it = v.begin(); it != v.end(); ++ it) it->intersect_by(); for(iterator it = v.begin(); it != v.end(); ++ it) for(iterator it1 = it + 1; it1 != v.end(); ++ it1) { it1->intersect_by(*it); it->intersect_by(*it1); } T total_area = 0; for(iterator it = v.begin(); it != v.end(); ++ it) total_area += it->area(); return total_area; } /* template <typename Container,typename Elem> typename Elem::value_type area(Container &v,const Elem& t) { typedef typename Container::iterator iterator; typedef typename Container::value_type::value_type T; for(iterator it = v.begin(); it != v.end(); ++ it) it->intersect_by(); for(iterator it = v.begin(); it != v.end(); ++ it) for(iterator it1 = it + 1; it1 != v.end(); ++ it1) { it1->intersect_by(*it); it->intersect_by(*it1); } T total_area = 0; for(iterator it = v.begin(); it != v.end(); ++ it) total_area += it->area(); return total_area; } */ } } } void main() { std::vector<analytical::elements::dynamic_polymorphism::curve<double> > v; std::cout << area(v) << std::endl; // std::cout << area(v,v[0]) << std::endl; }
[解决办法]
我照你的程序写了个简单的,编译是过的
#include <vector>
template <typename T>
class A
{
public:
T a;
};
template <typename T, template <typename> class Container>
void MyFunc(Container<A<T> > & a)
{
printf ("hello");
}
int main()
{
std::vector<A<int> > a;
MyFunc(a);
return 0;
}