从指针到基类成员的模板推导
Template deduction from pointer to base-class member
我不知道我做错了什么。从指针到基类成员的模板推导中的问题 - &DerivedClass::BaseClassMemeber。
完整示例:
#include <vcl.h>
#include <tchar.h>
struct Base
{
int BaseClassMember;
};
struct Derived : public Base
{
};
template<class T1, class T2>
void Test(T1& Param1, T2 T1::* Param2)
{
}
int _tmain()
{
Derived inst;
// Compile error E2285 Could not find a match for 'Test<T1,T2>(B,int A::*) - BCC32
// Error 1 error C2782: 'void Test(T1 &,T2 T1::* )' : template parameter 'T1' is ambiguous - MS VS8
Test(inst, &Derived::BaseClassMember);
// Works great
Test<Derived>(inst, &Derived::BaseClassMember);
return 0;
}
我可以找到几种解决方法,例如,附加测试函数重载了一个模板参数,static_cast隐式部分专用化(测试)。
但是我对为什么编译器不能使用在&DerivedClass::BaseClassMemeber中明确指定的类的原因感兴趣。这就是问题所在。如果您有更优雅的问题解决方案,欢迎。
&Derived::BaseClassMember
的类型为 int Base::*
,而不是 int Derived::*
。标准:
一元
&
运算符的结果是指向其操作数的指针。操作数应为左值或限定 ID。如果操作数是一个限定 id,命名某个类C
的非静态成员m
类型为T
,则结果的类型为"指向类型T
的类C
成员的指针",并且是指定C::m
的 prvalue 。[...跳过...][示例:
struct A { int i; };
struct B : A { };
... &B::i ... // has type int A::*i
— 结束示例]
如果需要此类型,则必须将值强制转换为 int Derived::*
。
相关文章:
- 从成员指针到整个结构/类的强制转换
- OOP 中的单成员指针
- 使用结构成员指针在C++中填充结构
- 聚合初始化,将成员指针设置为同一结构成员
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 共享 C++ 的数据成员指针
- 如何声明指向成员内容的成员指针m_pmd/m_pmf并访问它们?
- 从类C++外部调用指向成员方法的成员指针
- 结构成员指针是否自动初始化为零?
- 如何删除类内类类型的类成员指针
- 是否打印指向已定义 int 的成员指针
- 指向常量的成员指针
- 通过此指针访问时的成员差异和自身的成员指针(简单的 QT 示例问题)
- 类数据成员指针的非类型模板参数包无法使用 gcc 编译
- 为什么我不能在同一行中定义两个相同类型的类的成员指针
- 将类成员指针传递给 Lambda 捕获列表 c++11
- 在单一实例类中将成员指针设置为 null 的正确方法是什么
- 无法删除在destructor中的成员指针的课程
- 删除对象而不调用成员指针的析构函数
- 当派生类的基类具有成员指针时,对其进行深层复制