【问题标题】:Getting error C2512 in constructor call在构造函数调用中出现错误 C2512
【发布时间】: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,与现在相同。

【问题讨论】:

标签: c++ templates


【解决方案1】:

问题是您尝试创建vecimp&lt;TYPE&gt; 的实例,但vecimp 不是模板结构。

这么简单

this->imp = 
    new vecimp
    (arr, n);

会正常工作的。

【讨论】:

  • 这行得通,但是vecimp 怎么没有模板化?我写template &lt;class TYPE&gt;,并在vecimp 中使用TYPE *arr
  • @stackptr vec 类是一个模板类,但不是 vecimpl 本身。如果您想完全限定它,那么它将是vec&lt;TYPE&gt;::vecimpl,模板参数属于vec 类。由于vecimplvec&lt;TYPE&gt;模板内,当然可以使用TYPE
猜你喜欢
  • 1970-01-01
  • 2016-05-19
  • 2016-03-28
  • 2013-08-25
  • 2012-10-10
  • 1970-01-01
  • 1970-01-01
  • 2014-12-31
相关资源
最近更新 更多