gpt4 book ai didi

c++ - 在 C++ 模板代码中找不到构造函数

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:26:53 24 4
gpt4 key购买 nike

<分区>

使用 g++ main.cpp Vec.cpp -Wall -o main -I 编译时出现此错误。

/tmp/cciqbEQJ.o: In function `main':
main.cpp:(.text+0x8b): undefined reference to `Vec<double>::Vec()'
main.cpp:(.text+0x9b): undefined reference to `Vec<double>::~Vec()'
collect2: ld returned 1 exit status
make: *** [all] Error 1

我不明白,因为我之前做过很多多源文件程序,从来没有出现过找不到构造函数的错误。编译器似乎无法将模板代码动态绑定(bind)到模板的实例化。另外,我在 .h 文件上放置了一个宏守卫,但它没有显示在下面。

源代码如下:

Vec.cpp

#include "Vec.h"

using namespace std;

template<class T>
Vec<T>::Vec() {
create();
}


template<class T>
Vec<T>::Vec( size_type n, const value_type& t ){
create(n,t);
}
template<class T>
Vec<T>::Vec(const Vec& v)
{
create(v.begin(), v.end());
}

template<class T>
Vec<T>::~Vec(){
uncreate();
}

template<class T>
void Vec<T>::create()
{
data = avail = limit = 0;
}

template<class T>
void Vec<T>::create(size_type n, const T& val)
{
data = alloc.allocate(n);
limit = avail = data + n;
uninitialized_fill(data,limit, val);
}

template<class T>
void Vec<T>::create(const_iterator i, const_iterator j) {

data = alloc.allocate(j-i);
limit = avail = uninitialized_copy(i, j, data);
}
template<class T>
void Vec<T>::uncreate() {

if (data) {

iterator it = avail;
while (it != data)
alloc.destroy(--it);

alloc.deallocate(data,limit-data);
}
data = limit = avail =0;
}

template<class T> void Vec<T>::grow() {
size_type new_size = max ( 2 * (limit-data), ptrdiff_t(1));

iterator new_data = alloc.allocate(new_size);
iterator new_avail = unitialized_copy(data, avail, new_data);

uncreate();
data = new_data;
avail = new_avail;
limit = data + new_size;

}


template<class T> void Vec<T>::unchecked_append(const T& val) {
alloc.construct(avail++, val);
}

template<class T>
void Vec<T>::push_back(const T& t){
if ( avail == limit )
grow();

unchecked_append(t);
}

Vec.h

    template<class T> class Vec{
public:
typedef T* iterator;
typedef const T* const_iterator;
typedef size_t size_type;
typedef T value_type;

Vec();
Vec( size_type n, const T& t=T() );

Vec(const Vec& v);
Vec& operator=(const Vec& v);

~Vec();
void push_back(const T& t);

inline size_type size() const { return limit - data; }

inline iterator begin() {return data;}
inline const_iterator begin() const { return data; }

inline iterator end() { return limit; }
inline const_iterator end() const { return limit; }

inline T& operator[](size_type i){
return data[i];
}
const T& operator[](size_type i) const { return data[i]; }


private:
iterator data;
iterator limit;
iterator avail;

//facilities for memory allocation
allocator<T> alloc;

//allocate and initialize the underlying array
void create();
void create(size_type, const T&);
void create(const_iterator, const_iterator);

//destroy the elements in the array and free the memory
void uncreate();

//support functions for push_back
void grow();
void unchecked_append(const T&);
};

主要.cpp

 int main(void) {
Vec<double> test;
}

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com