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