如何消除具有相同模板参数名称的模板类的两个实例的歧义
How to disambiguate two instances of template classes with the same template parameter name
我遇到了一个问题,我不知道如何用一行话来表达它。问题是关于模板的。情况如下:在我的代码中,我有两个具有相同模板参数的类:
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;
,查看结果
相关文章:
- 从C++实例化QML
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 如何在c++中为模板函数实例创建快捷方式
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 设计一个只能由特定类实例化的类(如果可能的话,通过make_unique)
- 构造对象的歧义
- 如何创建一个空的全局类并在启动时实例化它
- 无法创建抽象类的实例
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 我收到以下错误:抛出'std::bad_alloc'实例后终止调用
- 建议在运行时将带有类实例的列表从c++导入qml
- 约束和显式模板实例化
- 通过实例理解std::move及其目的
- 为什么包含windows.h会产生语法错误,从而阻止类的实例化?(C2146,C2065)
- 有没有一种"cleaner"的方法可以在指向基的指针向量中找到派生类的第一个实例?
- 消除函数指针和指向类实例的指针之间的歧义
- 模板实例化歧义
- 如何消除具有相同模板参数名称的模板类的两个实例的歧义