如何消除具有相同模板参数名称的模板类的两个实例的歧义

How to disambiguate two instances of template classes with the same template parameter name

本文关键字:歧义 实例 两个 何消 参数      更新时间:2023-10-16

我遇到了一个问题,我不知道如何用一行话来表达它。问题是关于模板的。情况如下:在我的代码中,我有两个具有相同模板参数的类:

template< typename TEMPLT_PRM1,
          typename TEMPLT_PRM2>
class MyC_A;
template< typename TEMPLT_PRM1,
          typename TEMPLT_PRM2>
class MyC_B;

现在MyC_A类的一个函数接收MyC_B类型的参数,这就是我面临的问题是:

template< typename TEMPLT_PRM1,
          typename TEMPLT_PRM2>
class MyC_A
{
private:
//....
public:
    void foo( MyC_B<TEMPLT_PRM1, TEMPLT_PRM2> & bInst )
    {
         //....
    }
};

我实例化了一个MyC_A类型的对象和另一个MyC_B类型的对象。下面是实例化:

MyC_A<MyC_C, MyC_D> myc_a_inst;
MyC_B<MyC_E, MyC_F> myc_b_inst;
myc_a_inst.foo( myc_b_inst);

这给了我一个错误,说没有找到函数定义。这意味着编译器正在寻找void foo(MyC_B <MyC_C,>),它找不到它。相反,我的MyC_B对象实例的类型是MyC_B<MyC_E,>.

我相信这是因为MyC_A和MyC_B两个类的模板参数是相同的,我不能改变。

对于如何解决这个问题,我非常感激。

顺便说一句,我也试过下面的方法,但没有成功。

template< typename TEMPLT_PRM1_B,
          typename TEMPLT_PRM2_B>
void foo( MyC_B<TEMPLT_PRM1_B, TEMPLT_PRM2_B> & bInst )

您已经创建了myc_b_inst,其类型名称为MyC_E &MyC_F。在函数foo中,传递的形参使用typename MyC_C &如果您没有得到它,请仔细查看函数的定义。你使用了与MyC_A类相同的类型名,在本例中是MyC_C &MyC_D)。所以参数不匹配。这是产生错误的一个可能原因。试一试:

MyC_B<MyC_C, MyC_D> myc_b_inst;
不是

MyC_B<MyC_E, MyC_F> myc_b_inst;

,查看结果