【发布时间】:2016-02-21 15:30:00
【问题描述】:
当我从另一个类的构造函数调用一个类的构造函数时,我收到错误 C2512。我在文件底部使用模板实例,这样我就不必在头文件中实现成员函数。通常,这是由于没有默认构造函数造成的,但我有。
vec.h
template <class TYPE> class vec {
struct vecimp;
vecimp *imp;
public:
vec() { }
vec(const TYPE *, size_t);
~vec();
};
vec.cpp
#include "vec.h"
template <class TYPE> struct vec<TYPE>::vecimp {
TYPE *arr;
size_t n;
vecimp(const TYPE *arr, size_t n)
{
this->arr = (TYPE *) malloc(n * sizeof(TYPE));
this->n = n;
}
~vecimp()
{
free(this->arr);
this->arr = NULL;
}
};
template <class TYPE> vec<TYPE>::vec(const TYPE *arr, size_t n)
{
this->imp =
new vecimp
<TYPE> // C2512 occurs here
(arr, n);
}
// member function implementations, dtor, etc
template class vec<int>;
这是错误消息文本
'vec::vecimp': 没有合适的默认构造函数可用
所以我尝试向我的vecimp 类添加一个默认构造函数,但随后它给了我编译器错误 C2275,与现在相同。
【问题讨论】:
-
stackoverflow.com/a/495056/2469027 这个答案说您可以将所需的声明放在 .cpp 文件的底部。 @LogicStuff