首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C++模板,分配“静态”和“动态”对象的问题

C++模板,分配“静态”和“动态”对象的问题
EN

Stack Overflow用户
提问于 2011-04-03 03:07:59
回答 4查看 108关注 0票数 3

这段代码中有什么错误?

代码语言:javascript
运行
复制
template <typename T>
class Sample
{
public:
    T first;
    T second;
    typedef T Type;
};

and 

template <typename Item> 
class Process
{
public:
    void process (Item *item) 
    {
        typename Item::Type var = item->first + item->second;
        //Some code...
    }
};

方法"process“应该能够处理同时分配了"static”和“dynamic”的对象。...The优先选项有效

代码语言:javascript
运行
复制
int main(int argc, _TCHAR* argv[])
{
Sample <double> s;
Process <Sample <double> > a;
a.process(&s);

return 0;
}

但第二个不是

代码语言:javascript
运行
复制
int main(int argc, _TCHAR* argv[])
{

Sample <double> *s = new Sample <double>();
Process <Sample <double> *> a;
a.process(s); //Error  C2664: 'Process<Item>::process' : cannot convert parameter 1 from 'Sample<T> *' to 'Sample<T> *'
return 0;
}

如何设计一个类和方法“进程”,以便能够处理分配了“静态”和“动态”的对象?谢谢你的帮助。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-04-03 03:11:56

Process <Item>::process()需要一个Item*,所以Process <Sample <double> *>::process()需要一个Sample <double>**

然而,解决方案要简单得多:

代码语言:javascript
运行
复制
Sample <double> *s = new Sample <double>();
Process <Sample <double> > a;
a.process(s);

对于Process来说,对象是如何分配的一点都不重要,它得到的只是一个指向它的指针并使用它(假设它不会保持所有权或试图删除该对象)。

票数 3
EN

Stack Overflow用户

发布于 2011-04-03 03:12:32

代码语言:javascript
运行
复制
Sample <double> *s = new Sample <double>();
Process <Sample <double> *> a; //<<----------- here you go wrong!
a.process(s); 

Process的参数应该仍然是Sample<double>,而不是Sample<double>*,因为后者会生成Item* => Sample<double>**,而您在调用process成员函数时没有传递它。

所以正确的代码应该是:

代码语言:javascript
运行
复制
Process <Sample<double> > a; //<<----------- now it's correct!
a.process(s);

现在应该可以用了!

或者执行以下操作:

代码语言:javascript
运行
复制
Sample <double> *s = new Sample <double>();
Process <Sample <double> *> a; //<------ your version!
a.process( &s );                 //<------ note I'm passing pointer to pointer!
       // ^^ note the ampersand (&)
票数 2
EN

Stack Overflow用户

发布于 2011-04-03 03:12:38

问题不在于对象是以某种方式分配的。不可能判断一个对象是在堆栈上还是在空闲存储上分配的,至少通过任何可移植的、标准的方式。对于“栈”对象和“空闲存储”对象,通过指针访问对象成员的方式是完全相同的。

实际问题是您向第二个代码片段中的Process<>变量定义传递了错误的类型:

代码语言:javascript
运行
复制
Process <Sample <double> *> a;

看一看Process<>的定义

代码语言:javascript
运行
复制
template <typename Item>
class Process
{
public:
    void process (Item *item)
    { /* ... */ }
};

Item的类型为Sample <double> *时,process()的函数签名为:

代码语言:javascript
运行
复制
void process (Sample <double>** item)
{ /* ... */ }

显然这不是你想要的。

要修复此问题,请更改

代码语言:javascript
运行
复制
Process <Sample <double> *> a;

代码语言:javascript
运行
复制
Process <Sample <double> > a;

使用后者,process()的函数签名就变成了void process (Sample <double>* item),这应该允许编译您的两个代码片段。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5525262

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档