首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

双重模板函数总是不匹配的有关问题

2012-06-08 
双重模板函数总是不匹配的问题最近碰到个模板函数不能匹配的问题,总是不能解决,求大侠指点。。。模板定义如下

双重模板函数总是不匹配的问题
最近碰到个模板函数不能匹配的问题,总是不能解决,求大侠指点。。。

模板定义如下:

C/C++ code
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;        }    }  }}

调用函数部分很简单
C/C++ code
int main(){   ...    std::vector<analytical::elements::dynamic_polymorphism::curve<double> > v;    v.push_back(...);    std::cout << area(v) << std::endl;   ...}


编译提示这样的错误信息:
main.cpp:36:21: error: no matching function for call to ‘area(std::vector<analytical::elements::dynamic_polymorphism::curve<double> >&)’
main.cpp:36:21: note: candidate is:
curve.hpp:100:10: note: template<class T, template<class> class Container> T analytical::elements::dynamic_polymorphism::area(Container<analytical::elements::dynamic_polymorphism::curve<T> >&)

这样的问题是什么原因呢,是调用的时候的vector没能匹配模板中的Container吗?如果是的话,怎么才能解决这个问题呢?求救啊……

[解决办法]
LZ用的boost代码去掉了,在我的机器上编译不过
C/C++ code
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;
}

热点排行