C++,带有默认参数的模板

发布于 2024-11-07 09:26:34 字数 2644 浏览 0 评论 0 原文

一个简化的例子:

有一个代表通用容器的抽象模板类 GCont

template <typename Item>
struct TList
{
    typedef std::vector <Item> Type;
};


template <typename Item>
class GCont
{
    protected:
            typename TList <Item>::Type items;

    public:
            typedef Item type;
            virtual ~GCont() = 0 {};
};

和具有一个隐式参数的派生抽象模板类

template < typename Item, const bool par = true>
class GCont2 : public GCont <Item>
{
    public:
            GCont2 () : GCont <Item> () {}
    virtual ~GCont2() = 0 {};
};

及其对指针的特化

template <typename Item, const bool par>
class GCont2 <Item *, par> : public GCont <Item *>
{
    public:
            GCont2 () : GCont <Item *> () {}
            virtual ~Cont() {}
};

派生模板类 Cont

template <typename Point, const bool par = true>
class Cont : public GCont2 <Point, par>
{
    public:
            Cont() : GCont2 <Point, par>() {}
            virtual ~Cont() {}
};

和对指针的特化

template <typename Point, const bool par>
class Cont <Point *, par> : public GCont2 <Point *, par>
{
    public:
            Cont() : GCont2 <Point *, par> () {}
};

类点:

template <typename T>
class Point
{
    protected:
            T x, y, z;
};

是否可以编写一个函数 test( )有一个通用形式参数允许同时使用

Cont <Point <T> *> *points

Cont <Point <T> *, false> *points

在我的程序中

template <typename T>
void test (Cont <Point <T> *> *points)
{
std::cout << "test";
}

template <typename T>
void test2 (Cont <Point <T> *, false> *points)
{
std::cout << "test2";
}

int _tmain(int argc, _TCHAR* argv[])
{
Point <double> * p = new Point <double>();
Cont <Point <double> *, false> points;

    test(&points); //Error
     test2(&points); //OK

return 0;
}

在翻译过程中出现以下错误:

Error   1   error C2784: 'void test(Cont<Point<T>*> *)' : could not deduce template argument for 'Cont<Point<T>*> *' from 'Cont<Point,par> *'   g:\templates_example.cpp    27

感谢您的帮助...

更新状态

我修剪了代码...但问题仍然存在...我的代码编译时没有出现相同的错误MSVS 2010。

我找到了容器的部分解决方案-模板化。

template <typename Container>
void test (Container *points)
{
std::cout << "test";
}

A simplified example:

There is an abstract template class GCont representing a general container

template <typename Item>
struct TList
{
    typedef std::vector <Item> Type;
};


template <typename Item>
class GCont
{
    protected:
            typename TList <Item>::Type items;

    public:
            typedef Item type;
            virtual ~GCont() = 0 {};
};

and derived abstract template class having one implicit parameter

template < typename Item, const bool par = true>
class GCont2 : public GCont <Item>
{
    public:
            GCont2 () : GCont <Item> () {}
    virtual ~GCont2() = 0 {};
};

and its specialization for pointers

template <typename Item, const bool par>
class GCont2 <Item *, par> : public GCont <Item *>
{
    public:
            GCont2 () : GCont <Item *> () {}
            virtual ~Cont() {}
};

The derived template class Cont

template <typename Point, const bool par = true>
class Cont : public GCont2 <Point, par>
{
    public:
            Cont() : GCont2 <Point, par>() {}
            virtual ~Cont() {}
};

and specialization for pointers

template <typename Point, const bool par>
class Cont <Point *, par> : public GCont2 <Point *, par>
{
    public:
            Cont() : GCont2 <Point *, par> () {}
};

Class Point:

template <typename T>
class Point
{
    protected:
            T x, y, z;
};

Is it possible to write a function test() having an universal formal parameter alowing to use both

Cont <Point <T> *> *points

and

Cont <Point <T> *, false> *points

In my program

template <typename T>
void test (Cont <Point <T> *> *points)
{
std::cout << "test";
}

template <typename T>
void test2 (Cont <Point <T> *, false> *points)
{
std::cout << "test2";
}

int _tmain(int argc, _TCHAR* argv[])
{
Point <double> * p = new Point <double>();
Cont <Point <double> *, false> points;

    test(&points); //Error
     test2(&points); //OK

return 0;
}

During the translation the following error appears:

Error   1   error C2784: 'void test(Cont<Point<T>*> *)' : could not deduce template argument for 'Cont<Point<T>*> *' from 'Cont<Point,par> *'   g:\templates_example.cpp    27

Thanks for your help...

Updated status:

I trimmed the code... But the problem remains... My code does not compile with the same error using MSVS 2010.

I found the partial solution-templatization of the container.

template <typename Container>
void test (Container *points)
{
std::cout << "test";
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

要走就滚别墨迹 2024-11-14 09:26:34

你的代码对我来说编译得很好,你没有给我们你真正拥有的代码。除此之外,您的问题似乎是您想要提供错误的输入。您的 test 函数需要一个指向点的指针容器 (Cont* >),但您提供了一个点容器 (Cont >):

Cont< Point<int> >* pc;
// ...
test(pc);

这当然会产生您得到的错误。你需要一个

Cont< Point<int>* >* pc;

即指针的容器。您在问题中正确执行了此操作,但您的真实代码似乎并非如此。

Your code compiles totally fine for me, you're not giving us the code you really have. Aside from that, your problem seems to be that you want to provide the wrong input. Your test function expects a container of pointers to points (Cont< Point<T>* >), but you provide a container of points (Cont< Point<T> >):

Cont< Point<int> >* pc;
// ...
test(pc);

This will of course produce the error you get. You need a

Cont< Point<int>* >* pc;

That is, a container of pointers. You do this correctly in your question, but your real code doesn't seem to be that.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文