C++ C++;自定义STL向量实例化错误
我正在编写我自己的稍微弱一点的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&
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:是的,默认构造函数不是问题所在:未显示的模板化构造函数是!默认构造函数只是一个明确的指示,表明您没有发布一个,而是发布了其他内容。