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

时间:2013-09-15 02:29:02

标签: c++ vector stl instantiation

我正在编写自己的,略微较弱的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*
}

现在我在Mint 15上,编译:

g++ -std=c++11 -Wall -Werror # gcc-4.8.1

,实施文件是:

#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;
}

我尝试过从GCC 4.8.1中筛选出std :: vector,但它很少出现。我能看到的唯一真正的区别是我没有使用分配器,但这不会对类的实例化产生影响!

虽然我只提供了相关信息,但这是我迄今为止所实施的所有信息。在编写模板类时,我倾向于利用惰性实例化规则并在编写时测试所有内容(它更慢,但至少我知道一切正常)。

非常感谢任何帮助。

干杯,

cjdb01

2 个答案:

答案 0 :(得分:2)

在修复了各种缺失的详细信息(例如typedefsize_type的必要pointer并添加默认构造函数)后,已发布的代码会进行编译和链接。鉴于有另一个构造函数缺失并且基于您的错误,我很确定还有另一个构造函数看起来像这样:

template <typename S>
vector(size_type, S); // not, yet, defined

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

答案 1 :(得分:1)

在我看来,你的问题是你正在重新定义vd2。

std :: vector vd2 (100,30); //编译好了

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