c++ - 继承自std::vector,编译错误? (最烦人的解析)

标签 c++ most-vexing-parse

对于看到这个问题的人: 查看答案并考虑使用: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??
}

最佳答案

 RangeVec<int> a(  RangeVec<int>(b) );

这是一个函数声明 a返回 RangeVec<int>并采用一个名为 b 的参数类型 RangeVec<int> .这是 most vexing parse .您可以使用 C++11 的统一初始化语法修复它:

 RangeVec<int> a{RangeVec<int>{b}};

或者,如果您没有 C++11 编译器,只需引入一对额外的括号:

 RangeVec<int> a((RangeVec<int>(b)))

另请注意,从标准容器派生的是 usually a bad idea .

关于c++ - 继承自std::vector,编译错误? (最烦人的解析),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24416362/

相关文章:

c++ - 如何将 void* 放入 COM VARIANT,以便它被 COM-Interop 编码为 IntPtr 到 .NET?

java - 隐式转换和显式转换的区别

c++ - 带空括号的默认构造函数

c++ - 从方法堆栈编译中按值返回实例

c++ - 默认构造函数 C++

c++ - 'inet_addr' : Use inet_pton() or InetPton() instead or define _WINSOCK_DEPRECATED_NO_WARNINGS

c++ - static_cast<T>(funcReturningT()) 是否会抑制 RVO?

C++11 match_regex 不匹配简单模式

c++ - 当有额外的括号时,在临时对象上调用用户定义的 operator+ 时出错

c++ - 构造函数不返回可用对象