【发布时间】:2013-11-16 05:27:26
【问题描述】:
我试过搜索这个,但我想到的每个词最终都会得到完全不相关的结果。
我有一个将指向成员的指针作为参数的函数(模板),但我似乎无法隐含地将指向的成员视为 const。使用 const_cast 是可行的,但如果可以的话,我想避免显式调用它。
struct MyStruct
{
int *_array;
int _size;
};
template<typename C, typename T>
void DoSomething(T* C::* arr, int siz)
{
// do some read-only stuff with the member here
}
template<typename C, typename T>
void ConstDoSomething(T* C::* arr, int siz)
{
DoSomething<C, T const>(arr, siz);
// DoSomething<C, T const>(const_cast<T const* C::*>(arr), siz); // works
}
MyStruct ms;
ConstDoSomething<MyStruct const, int>(&MyStruct::_array, ms._size); // note: cannot convert ‘arr’ (type ‘int* MyStruct::*’) to type ‘const int* MyStruct::*’
这是一个简化的示例,演示了我在使用更复杂的类树时遇到的问题。我试图避免强制转换,因为调用代码(例如,使用类模板的人)需要它。
更新:当我第一次发布这个时,我不小心使用了一个没有产生相同错误的代码示例。我花了相当多的测试来确定根本原因,即我在模板参数中添加了 const 限定符。上面的示例现在正确地演示了我正在使用的行为。
【问题讨论】:
-
不管怎样,我在 llvm 5.0、mingw gcc 4.7.0 和 4.7.2 上成功编译了你的代码片段。您能否更新您的 mingw 安装,或者在帖子中包含一个完整的程序?
-
我不知道我昨晚在做什么,我认为这个 sn-p 给出了相同的结果。 一切我试图复制它,但没有使用我完整的 550+ 行程序编译正常。我显然在其他地方犯了一些愚蠢的错误。如果我找不到它,那么我想我会在这里发布完整的代码。 ://
-
代码示例已更新。如果您有任何其他详细信息,请告知,谢谢!
标签: c++ compiler-errors constants pointer-to-member