【问题标题】:Instantiate an object of template class type in C++在 C++ 中实例化模板类类型的对象
【发布时间】:2018-03-30 06:27:28
【问题描述】:

我在用 C++ 实例化模板类类型的对象时遇到问题。

代码如下:

数组.h:

//Developed by Trofimov Yaroslav on 30.03.2018

#ifndef _ARRAY_H_TROFIMOV_
#define _ARRAY_H_TROFIMOV_

template<size_t n, typename T>
class Array
{
        static unsigned __freeId, __quantity;
        unsigned _id;

        T* _array;
public:
        template<size_t n, typename T>
        Array(void);
        ~Array(void);
        T& operator[](const size_t);
};
#include "Array.cpp"

#endif

数组.cpp:

//Developed by Trofimov Yaroslav on 30.03.2018
#include "Array.h"

template<size_t n, typename T>
Array::Array(void) 
    : _id(++__freeId), _array(new T[]) {

}

template<size_t n, typename T>
Array::~Array(void) {

}

template<size_t n, typename T>
T& Array::operator[](const size_t i) {

}

Main.cpp:

//Developed by Trofimov Yaroslav on 30.03.2018
#include <iostream>
#include "Array.h"

int main(void) {
    Array<7, int> a;
    return 0;
}

现在,当我将鼠标悬停在 Main.cpp 中的 a 上时,我看到以下内容:

错误:类“Array”不存在默认构造函数

但正如您所见,默认模板构造函数确实存在。那么,我在这里缺少什么?

【问题讨论】:

  • template&lt;size_t n, typename T&gt; Array(void); --> Array(); stackoverflow.com/questions/495021/…
  • @liliscent,谢谢。我以前读过这篇文章,但我仍然无法在这里解决我的问题。
  • @ggghahaha 就像 liliscent 说的,你需要从构造函数中删除额外的template,它不属于那里。此外,在您的 cpp 文件中,您需要将所有 Array:: 替换为 Array&lt;n, T&gt;::
  • @RemyLebeau,在替换了第一个 Array:: 并删除了 template 之后,我得到了错误语法错误。因此,我认为你的建议没有用。

标签: c++ templates constructor


【解决方案1】:

您的代码中有多个错误。

在你的头文件中,你需要从构造函数中删除额外的template,它不属于那里。

在您的 cpp 文件中,您需要将所有 Array:: 替换为 Array&lt;n, T&gt;::。您的构造函数需要将n 传递给new[]。你的析构函数需要delete[] 数组。而operator[] 需要返回一些东西。

您的类有static 成员,因此您还需要实例化它们的实例。

试试这个:

数组.h

#ifndef _ARRAY_H_TROFIMOV_
#define _ARRAY_H_TROFIMOV_ 

template<size_t n, typename T>
class Array
{
        static unsigned __freeId, __quantity;
        unsigned _id;

        T* _array;
public:
        Array(void);
        ~Array(void);
        T& operator[](const size_t);
};

#include "Array.cpp"

#endif

数组.cpp

#include "Array.h" 

template<size_t n, typename T>
Array<n, T>::Array(void) 
    : _id(++__freeId), _array(new T[n]) {
}

template<size_t n, typename T>
Array<n, T>::~Array(void) {
    delete[] _array;
}

template<size_t n, typename T>
T& Array<n, T>::operator[](const size_t i) {
    return _array[i];
}

Main.cpp

#include "Array.h"

template<> unsigned Array<7, int>::__freeId = 0;
template<> unsigned Array<7, int>::__quantity = 0;

int main() {
    Array<7, int> a;
    return 0;
}

Live deno

【讨论】:

  • 据我了解,不可能将.cpp 用于模板实现,同时也不可能在使用之前创建模板特化。我说的对吗?
  • @ggghahaha 您可以将模板声明与定义分开,只要它们在同一个翻译单元中完成,此代码通过拥有.h 文件#include.cpp 文件来实现。如果您尝试将.cpp 编译为自己的单元,那么它将无法正常工作。
【解决方案2】:

在类中声明方法或构造函数时不需要使用模板。您声明的构造函数是模板类中的模板方法,而不是默认构造函数。

我从不依赖智能感知的错误,有时它是完全错误的,运行编译器通常会产生更准确更详细的错误消息。

【讨论】:

  • 只需从你的构造函数声明中删除模板语句,然后运行编译器,它会告诉你下一个错误
  • 所以,你基本上不是帮我解决问题,而是换一个。你这样做是为了什么?我总是可以删除我所有的代码并写一些乱码来得到另一个 - 与我的错误不同。而你只是建议我这样做。谢谢,但我不需要这样的帮助。
猜你喜欢
  • 1970-01-01
  • 2021-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多