C++,带有默认参数的模板
一个简化的例子:
有一个代表通用容器的抽象模板类 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";
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
你的代码对我来说编译得很好,你没有给我们你真正拥有的代码。除此之外,您的问题似乎是您想要提供错误的输入。您的
test
函数需要一个指向点的指针容器 (Cont* >
),但您提供了一个点容器 (Cont >
):这当然会产生您得到的错误。你需要一个
即指针的容器。您在问题中正确执行了此操作,但您的真实代码似乎并非如此。
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> >
):This will of course produce the error you get. You need a
That is, a container of pointers. You do this correctly in your question, but your real code doesn't seem to be that.