这个指向成员的指针转换有什么问题
what is wrong with this pointer to member conversion?
此代码有什么问题?我想我可以转换由于这个答案:
安全吗;upcast";方法指针,并将其与基类指针一起使用?
struct B
{
void f(){}
};
struct D : B
{
virtual ~D(){}
};
template <typename FP, FP fp>
void g()
{
}
int main()
{
g<void (D::*)(), &B::f>();
return 0;
}
错误:
t.cpp:18:27: error: could not convert template argument '&B::f' to 'void (D::*)()'
g<void (D::*)(), &B::f>();
这也不起作用:
g<void (D::*)(), static_cast<void (D::*)()>(&B::f)>();
这是标准(C++11,[temp.arg.notype]§5)不允许的:
对用作非类型模板参数的每个表达式执行以下转换如果非类型的模板参数无法转换为相应的模板参数的类型,则程序格式错误。
- 对于指向成员函数的指针类型的非类型模板参数,如果模版参数则,不应用任何转换。如果模板参数表示一组重载的成员函数,则从该集合中选择匹配的成员函数(13.4)
(强调矿)
由于[temp.arg.notype]§1:,也不允许铸造
非类型、非模板的模板参数的template自变量应为以下之一:
- 指向如5.3.1中所述的成员的指针
其中5.3.1§4为:
只有当使用显式
&
并且其操作数是不包含在括号中的限定id时,才形成指向成员的指针。
这意味着不允许将强制转换表达式作为非类型模板参数。
因此,虽然这种转换在运行时是可能的,但似乎没有办法将它们用作模板参数。
相关文章:
- 努力将整数转换为链表。不知道我在这里做错了什么
- 是什么导致了这种使用三进制而不是短整型的有符号int到无符号int转换
- 从长整整转换为uint64_t的推荐方法是什么?
- C++:Lambda 函数指针转换的用例是什么?
- 将传入的网络"char*"数据转换为"uint8_t"并返回的安全方法是什么?
- 为什么此指针值不能转换为整数的规则是什么?
- 指针类型类成员的动态强制转换的恒定性是什么?
- 从 argv[1] 转换为字符 * 字符串后有什么问题?
- 当我使用 void 函数的返回值(通过强制转换函数指针)时,究竟会发生什么?
- 从二进制流中读取时,将双精度变量的地址转换为 char* 意味着什么?
- 使用 CStringW/CStringA 和 CT2W/CT2A 转换字符串有什么区别?
- 将QGyroscopeReading转换为QVector3D的正确方法是什么?
- C++ C4244 =':从"std::streamsize"转换为"无符号短",可能会丢失数据;有什么解决办法吗?
- 在从 C++ 转换为 C# 的代码中,我应该使用什么而不是 memcpy?
- 在C++中将uint64_t转换为void类型的目的是什么
- 在C++中,将无符号整数转换为八进制表示,反之亦然的最佳方法是什么
- 这个typedef和转换运算符语法是什么意思
- 是什么将程序集转换为实际可执行的材料
- 转换为非标量误差是什么意思?我该如何解决?
- 在 OpenGL 中计算矩阵时,转换的正确顺序是什么?