我遇到编译错误的问题,请看一下这段代码:
template<class T>
struct MyStruct
{
};
template<>
struct MyStruct<int>
{
typedef int* type;
};
template<class T>
void foo(const typename MyStruct<T>::type myType)
{
}
int main()
{
const int* ptr = NULL;
foo<int>(ptr);
return 0;
}
问题是编译器忽略了&#39; const&#39;在foo函数上,调用foo非法(const int * to int *)。
严重级代码描述项目文件行抑制状态 错误C2664&#39; void foo(const MyStruct :: type)&#39;:无法转换参数1来自&#39; const int *&#39; to&#39; const MyStruct :: type&#39;
我已经在Visual Studio&gt;和gcc的5.3编译器中测试了以下代码,两者都丢失了相同的错误。
编译人员是故意这样做的吗?为什么会这样?
答案 0 :(得分:7)
[error] Element message I put in target not found
和const int *
之间存在重要区别。有关差异的解释,请参阅this answer。
考虑int * const
的含义。它是const typename MyStruct<T>::type
MyStruct<T>::type
。在这种情况下,它是const
int*
。这是一个const
,一个无法重新分配新地址的指针,但仍可用于修改指向的int* const
。但是,您在int
中传递的指针是foo<int>(ptr)
,无法转换为const int *
,因为它会丢弃int * const
限定符。
要实现您的目标,const
必须是该类型的一部分才能成为指针。它不能在事后添加,也不会被解释为const
。您可以使用类型特征来删除类型的指针部分,添加const然后使其成为指针。
T * const