4

考虑一段代码:

class T;

void constructVector(const T* item)
{
   std::vector<T*> v;
   v.push_back(item);
}

MSVC 2010 编译器出现错误:

错误:C2664: 'void std::vector<_Ty>::push_back(_Ty &&)' : 无法将参数 1 从 'const T *' 转换为 'T *&&' with [ _Ty=T * ] 转换丢失限定符

我可以看到这种特定的转换是非法的,但我不相信我的代码在语义上是错误的。我也相信有push_back(const T&)变体,为什么这与我的电话不匹配?

4

2 回答 2

9

因为那是非常量指针的向量。它不会将 const 指针转换为非常量指针。那将违背 const 的目的。

我相信 push_back(const T&) 不是您要寻找的,因为这使 T 对象本身为const,它不会将 T 的类型从 (*) 更改为 (const *)。

您可以使向量成为 const 指针的向量:

void constructVector(const T* item)
{
    std::vector<const T*> v;
    v.push_back(item);
 }

或者您可以更改您的函数以采用非常量指针:

 void constructVector(T* item)
 {
    std::vector<T*> v;
    v.push_back(item);
 }
于 2013-09-12T18:33:30.840 回答
1

降低const

无效的constructVector(常量T*项目);

或者

利用:

void constructVector(const T* item)
{
   std::vector<const T*> v;
   v.push_back(item);
}
于 2013-09-12T18:30:40.487 回答