错误:离线构造函数不能具有模板参数C ++

SAS*_*ROG 1 c++ templates

我在Array.hpp文件中有一些看起来像这样的代码

template <typename T>

class Array {
   private:
    T *_array;
    int _arrSize;

   public:
    Array<T>();
    Array<T>(unsigned int n);
...
};
Run Code Online (Sandbox Code Playgroud)

然后在Array.cpp文件上我就这样

#include "Array.hpp"

template <typename T>
Array<T>::Array<T>(){};

template <typename T>
Array<T>::Array<T>(unsigned int n) : _arrSize(n) {
    T *a = new T[n];
    for (unsigned int i = 0; i < n; i++) {
        a[i] = 0;
    }
    this->_array = a;
};
...
Run Code Online (Sandbox Code Playgroud)

然后一个主像

int main() {
    Array<int> g(2);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但是当我尝试用它编译时,出现clang++ -Wall -Wextra -Werror -std=c++98 *.c此错误

Array.cpp:16:11: error: out-of-line constructor for 'Array' cannot have template arguments
Array<T>::Array<T>(){};
          ^    ~~~
Array.cpp:19:11: error: out-of-line constructor for 'Array' cannot have template arguments
Array<T>::Array<T>(unsigned int n) : _arrSize(n) {
          ^    ~~~
Run Code Online (Sandbox Code Playgroud)

我不确定自己在做什么错

vla*_*sch 6

你的定义原型是错误的:

template <typename T>
Array<T>::Array<T>(){};
Run Code Online (Sandbox Code Playgroud)

Visual Studio 2015 编译器发出此警告,使错误更加清晰:

warning C4812: obsolete declaration style: please use 'Array<T>::Array' instead
Run Code Online (Sandbox Code Playgroud)

所以你的实现应该是这样的:

template <typename T>
Array<T>::Array(){};

template <typename T>
Array<T>::Array(unsigned int n) : _arrSize(n) {
    ...
};
...
Run Code Online (Sandbox Code Playgroud)

这是因为构造函数本身不是“模板化”的。

如果声明会是什么样子。

template <typename T>
class Array<T> 
{
    template <typename Y>
    Array<T>(Y n);
};
Run Code Online (Sandbox Code Playgroud)

你需要这个额外的模板参数,但有另一个模板行:

template <typename T>
template <typename Y>
Array<T>::Array<Y>(Y n){};
Run Code Online (Sandbox Code Playgroud)

但是,您的代码的另一个问题是您从包含文件中隐藏了模板实现,因此编译器无法实例化它。

目前您main.cpp无法看到构造函数实现。它只看到标题中的声明。

您有不同的选择:

  1. 您只能通过在您的Array.cpp: 中显式实例化模板来限制您的类与类型的严格子集一起使用,例如: template class Array<int>;在文件范围内。对于容器类型,这似乎不是一个选项。
  2. 您将实现移动到头文件中。
  3. 如果你想分开声明和实现,你可以包含Array.cpp(但我会Array_Impl.hpp在你的标题末尾调用它(但你必须小心,因为 cpp 中的所有内容都将在标题中可见,并且对于包含你的所有文件)标题)


n. *_* m. 6

正确的语法是

Array<T>::Array()
Run Code Online (Sandbox Code Playgroud)

Array<T>::Array<T>()
Run Code Online (Sandbox Code Playgroud)

相关说明,在.cpp文件中实现模板几乎总是错误的

std::vector无论如何,您都应该使用。