我正在编写自己的,略微较弱的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
答案 0 :(得分:2)
在修复了各种缺失的详细信息(例如typedef
和size_type
的必要pointer
并添加默认构造函数)后,已发布的代码会进行编译和链接。鉴于有另一个构造函数缺失并且基于您的错误,我很确定还有另一个构造函数看起来像这样:
template <typename S>
vector(size_type, S); // not, yet, defined
您希望为此构造函数提供实现。
答案 1 :(得分:1)
在我看来,你的问题是你正在重新定义vd2。
std :: vector vd2 (100,30); //编译好了
vector vd2 (100,30); //错误:未定义引用