C++ C++;自定义STL向量实例化错误

C++ C++;自定义STL向量实例化错误,c++,vector,stl,instantiation,C++,Vector,Stl,Instantiation,我正在编写我自己的稍微弱一点的STL版本(它目前不支持分配器) 这里最重要的一点是: template <typename T> class vector { public: typedef T value_type; typedef value_type& reference; typedef const value_type&

我正在编写我自己的稍微弱一点的STL版本(它目前不支持分配器)

这里最重要的一点是:

template <typename T>
class vector
{
public:
  typedef T                                value_type;
  typedef value_type&                      reference;
  typedef const value_type&                const_reference;
  typedef random_access_iterator<T>        iterator;
  typedef random_access_iterator<const T>  const_iterator;
  typedef unative_t                        size_type;
  typedef native_t                         difference_type;
  typedef value_type*                      pointer;
  typedef const value_type*                const_pointer;

  vector(const size_type n = 0) : vector<T>(n, T()) { }

  vector(const size_type n, const T& val) : m_capacity(n == 0 ? 100 : n * 2),
                                        m_size(n), m_data(new T[m_capacity])
  {
    for (decltype(m_size) i = 0; i < m_size; ++i)
      m_data[i] = val;
  }

  // fancy declarations go here...
private:
  size_type m_capacity; // Where size_type is the unsigned word size of the CPU
  size_type m_size;     // for my computer, this is the equivalent of uint64_t.
  pointer m_data;       // At present, pointer is T*
}
实施文件为:

#include "structures/vector.hpp"
#include <vector>

int main()
{
  vector<int> vi;                   // compiles okay
  vector<float> vf(10);             // compiles okay
  vector<double> vd1(100, 30.0);    // compiles okay
  std::vector<double> vd2(100, 30); // compiles okay
  vector<double> vd2(100, 30);      // error: undefined reference to
                                    // vector<double>::vector<int>(int, int)
  return 0;
}
#包括“structures/vector.hpp”
#包括
int main()
{
向量vi;//编译正常
向量vf(10);//编译正常
向量vd1(100,30.0);//编译正常
std::vector vd2(100,30);//编译正常
向量vd2(100,30);//错误:未定义对的引用
//向量::向量(int,int)
返回0;
}
我尝试过从GCC4.8.1中筛选std::vector,但结果很少。我能看到的唯一真正的区别是我没有使用分配器,但这不应该对类的实例化产生影响

虽然我只提供了相关信息,但到目前为止我只实现了这些。在编写模板类时,我倾向于利用惰性实例化规则,并在编写时对所有内容进行测试(虽然速度较慢,但至少我知道所有内容都有效)

非常感谢您的帮助

干杯


cjdb01

发布的代码在修复了各种缺失的详细信息后(例如,
size\u type
pointer
所需的
typedef
s)并添加默认构造函数后,会编译和链接。考虑到缺少另一个构造函数,并且基于您的错误,我非常确定还有另一个构造函数看起来像这样:

template <typename S>
vector(size_type, S); // not, yet, defined
模板
向量(大小_类型,S);//还没有定义

您希望为此构造函数提供一个实现。

发布的代码在修复了各种缺失的详细信息(例如,
size\u type所需的
typedef
s和
指针
并添加默认构造函数后,会编译和链接。考虑到缺少另一个构造函数,并且基于您的错误,我非常确定还有另一个构造函数看起来像这样:

template <typename S>
vector(size_type, S); // not, yet, defined
模板
向量(大小_类型,S);//还没有定义

您希望为此构造函数提供一个实现。

在我看来,您的问题在于您正在重新定义vd2

std::vectorvd2(100,30);//编译好吗


向量vd2(100,30);//错误:对

的未定义引用在我看来,您的问题在于您正在重新定义vd2

std::vectorvd2(100,30);//编译好吗


向量vd2(100,30);//错误:未定义引用

您可以尝试
向量vd2(100,(双)30)我希望我的实现像STL一样透明。所有这些都是显式转换,但我确实想知道为什么我需要使用向量vd2(100,静态_转换(30))当STL等效项没有显示时。错误指向模板化构造函数,但代码没有显示它。你确定这些都是你拥有的构造函数吗?有趣的是,当我用同一个命令行运行代码时,我得到了完全不同的错误:你可以尝试
vectorvd2(100,(double)30)我希望我的实现像STL一样透明。所有这些都是显式转换,但我确实想知道为什么我需要使用向量vd2(100,静态_转换(30))当STL等效项没有显示时。错误指向模板化构造函数,但代码没有显示它。你确定这些都是你所有的构造函数吗?有趣的是,当我用同一个命令行运行代码时,我得到了完全不同的错误:我把默认构造函数放在上面的代码中(我从模板文件中复制和粘贴,模板文件中没有定义接口,所以没有复制默认值)错误仍然存在。添加您建议的内容将如何解决问题?您建议它应该做什么?我想委托给主构造函数vector(const size_type,const T&)。@cjdb01:是的,默认构造函数不是问题所在:未显示的模板化构造函数是!默认构造函数只是一个明确的指示,表明您没有发布,而是发布了其他内容。我已将默认构造函数放在上面的代码中(我从模板文件中复制并粘贴,模板文件中没有定义我的接口,因此未复制默认值),错误仍然出现。添加您建议的内容将如何解决问题?您建议它应该做什么?我想委托给主构造函数vector(const size_type,const T&)。@cjdb01:是的,默认构造函数不是问题所在:未显示的模板化构造函数是!默认构造函数只是一个明确的指示,表明您没有发布一个,而是发布了其他内容。