对于看到此问题的人: 看一下答案并考虑使用:cdecl
为什么下面的代码会产生编译错误:
prog.cpp: In function ‘int main()’:
prog.cpp:23:4: error: request for member ‘size’ in ‘a’, which is of non-class type ‘RangeVec<int>(RangeVec<int>)’
a.size();
^
我不明白这段代码有什么问题?
#include <iostream>
#include <vector>
template<typename Type>
class RangeVec: public std::vector<Type> {
public:
RangeVec( const RangeVec & v): std::vector<Type>(v){}
RangeVec( const RangeVec && v): std::vector<Type>(std::move(v)) {}
RangeVec( const std::vector<Type> &v)
: std::vector<Type>(v)
{
//std::sort(std::vector<Type>::begin(),std::vector<Type>::end());
}
};
int main(){
std::vector<int> v;
RangeVec<int> b(v);
RangeVec<int> a( RangeVec<int>(b) );
a.size(); // b.size() works ???? why??
}
答案 0 :(得分:6)
RangeVec<int> a( RangeVec<int>(b) );
这是一个函数a
的声明,它返回一个RangeVec<int>
并接受一个名为b
RangeVec<int>
的{{1}}参数。这是most vexing parse。您可以使用C ++ 11的统一初始化语法来修复它:
RangeVec<int> a{RangeVec<int>{b}};
或者如果你没有C ++ 11编译器,只需引入一对额外的parantheses:
RangeVec<int> a((RangeVec<int>(b)))
另请注意,从标准容器派生的是usually a bad idea。