【问题标题】:How to pass structure with template variable as an argument inside member function of class in c++?c++ - 如何在c ++中类的成员函数内传递带有模板变量的结构作为参数?
【发布时间】:2022-08-04 21:15:54
【问题描述】:

我想将“带有模板变量的结构”作为参数传递给类的成员函数。我收到错误“没有匹配的调用函数”。谁能帮我?我在声明/定义/从主传递参数时犯了一些错误。

template <typename T>
struct msg_1{
   int var_1;
   int var_2;
   T *var_3;
};

template<typename T>
struct msg_2{
    int var_1;
    int var_2;
    T *var_3;
};

class A
{
 public:
  int a;
  int b;

  template <typename T>
  void test(T *, T *);
 };

 template <typename T>
 void A::test(T *t1, T *t2)
 {      cout<<\"Inside test @todo Do something\"; }

int main()
{
 A ob;
 ob.a=10;
 ob.b=20;

 msg_1<int> *ob_1 = new msg_1<int>;
 msg_2<int> *ob_2 = new msg_2<int>;

 ob.test(ob_1,ob_2);

 return 0;
}

======== 我已经接受了给定的建议并修改了代码,但在实施时遇到了一些错误。请看一看。

我已将结构作为参数传递给测试方法,如下所示

template <typename T>
struct msg1{
…
};

template<typename U>
struct msg2{
…
};

struct msg3
{
uint16_t var_4;
};

class A
{
 public:
 int a;
 int b;

 template <typename T, typename U>
 void test(msg1<T> *t1, msg2<U> *t2);
};

template <typename T, typename U>
void A::test(msg1<T> *t1, msg2<U> *t2)
{
 cout<<\"Inside test @todo Do something\";
}

int main()
{
 A ob;
 ob.a=10;
 ob.b=20;

 msg_1<msg3> *ob_1 = new msg_1<msg3>;
 msg_2<msg3> *ob_2 = new msg_2<msg3>;

 ob.test(ob_1,ob_2);

 return 0;
 }

当我在在线编译器中运行上面的代码时,它运行良好,但是当我在实际代码中实现它进行测试时,我得到编译时错误 “未定义对‘void A::test< msg3, msg3 > (msg1 *, msg2 *)’的引用。 谁能告诉我我做错了什么。

  • msg1&lt;int&gt;msg2&lt;int&gt; 是不同的类型,A::test 的每个实例化都需要两个指向同一类型的指针。
  • 嗨 molbdnilo,我在这里为 msg1<int> 和 msg2<int> 采用了相同的类型,并且只采用了一个带有 T 的模板。如果可能的话,您能否分享一下我对示例代码所做的具体操作。
  • 您不清楚“指向同一类型的指针”的哪一部分? msg_1&lt;int&gt;msg_2&lt;int&gt; 不是同一类型。在您看来,它们可能看起来一样,但事实并非如此。他们有不同的名字。
  • 很不清楚你在想什么。你和template&lt;typename T&gt; void f(T x, T y) {} int main() { f(12, 3.4); }有同样的情况,这不起作用,因为intdouble是不同的类型。如果要传递不同类型的参数,则需要两个模板参数。
  • 你到底想做什么?有一些方法可以修复代码,但不清楚应该保留什么以及应该修复什么。部分代码说A::test 具有相同类型的参数,其他部分希望它们是不同类型

标签: c++ templates


【解决方案1】:

您的模板函数A::test 仅使用一种类型T 进行模板化,并且要求两个参数具有相同类型T*。在您的示例中,您传递不同的参数:msg_1&lt;int&gt; *msg_2&lt;int&gt; *

如果你真的希望test 只接受两个相同类型的参数,那么你不能传递ob_1ob_2。如果您希望test 接受两个不同类型的参数,那么您可以更改您的类A 和函数A::test,如下所示。

class A
{
public:
  int a;
  int b;

  template <typename T1, typename T2>
  void test(T1 *, T2 *);
};

template <typename T1, typename T2>
void A::test(T1 *t1, T2 *t2)
{ cout<<"Inside test @todo Do something"; }

【讨论】:

  • 嗨 Werner,感谢您分享详细的解决方案。你的建议是正确的,现在它正在工作。
猜你喜欢
  • 2015-04-02
  • 2014-12-15
  • 1970-01-01
  • 2021-01-04
  • 1970-01-01
  • 1970-01-01
  • 2015-09-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多