【问题标题】:(C++) Passing a pointer into a template(C++) 将指针传递给模板
【发布时间】:2011-10-22 05:04:05
【问题描述】:

我有两个指针。 p1。 p2.
p1 和 p2 都指向不同的类。
这些类有一些相似的方法名称,
我想调用模板函数两次以避免重复代码。
这是我的功能:

template <class T>
void Function(vector<T> & list, T* item, const string & itemName)

看到那个中间参数“item”..如果我想改变项目,我的签名应该是这样的吗?

..或者我应该把它作为
T* & 项目

..或者我应该把它作为
T** 项目

编译器让很多东西滑动,但是当我去绑定所有东西时它会中断。

如何使用我的指针之一调用该函数?
关于铸造的东西?我已经尝试了一切:\

【问题讨论】:

  • 你想改变指针本身,还是只改变指向的对象?
  • 您的代码应该可以正常工作。您能否发布您的完整代码以查看是否存在 constness 问题或其他问题?
  • @Stefan:不,它不会按原样工作,因为原始指针的副本将传递给函数,并且对指针本身所做的任何更改对调用者都是不可见的。也就是说,假设 OP 想要更改指针 指向 的内容,并且公平地说,OP 非常模糊。如果他只是想改变对象本身,那么是的,它应该按原样工作。
  • 我想传入“item”,当它返回时,它可能指向别的东西。代码编译成目标文件,但是当我尝试将它们链接到我的可执行文件时,我遇到了问题。所有错误都涉及未定义的引用。也许我只是错误地调用模板函数?我必须投射我传入的内容吗?或者我可以只调用 Function(list,item,itemName);
  • 您的项目是否包含多个库?您是在 .h/.cpp 还是单个 .hpp 文件中定义了您的方法模板?看起来您在这里讨论了 2 个不相关的问题。

标签: c++ templates pointers parameters


【解决方案1】:

你应该可以这样调用你的代码:

template <class T>
void Function(std::vector<T> & list, T* item, const std::string & itemName)
{
    list.push_back(T());
    if (item != NULL)
      item->x = 4;
}

struct A
{
    int x;
};
struct B
{
    double x;
};
A a;
B b;
std::vector<A> d;
std::vector<B> i;
Function(d, &a, "foo");
Function(i, &b, "bar");

请注意,通过引用传递参数和通过指针传递参数的含义略有不同,例如指针可以为 NULL,参见Are there benefits of passing by pointer over passing by reference in C++?

我想知道是否希望通过指针传递item 并通过(非常量)引用传递list

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-10
    • 2018-12-07
    • 2021-09-15
    • 2018-08-11
    • 1970-01-01
    相关资源
    最近更新 更多