我在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此错误
Run Code Online (Sandbox Code Playgroud)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) { ^ ~~~
我不确定自己在做什么错
你的定义原型是错误的:
template <typename T>
Array<T>::Array<T>(){};
Run Code Online (Sandbox Code Playgroud)
Visual Studio 2015 编译器发出此警告,使错误更加清晰:
Run Code Online (Sandbox Code Playgroud)warning C4812: obsolete declaration style: please use 'Array<T>::Array' instead
所以你的实现应该是这样的:
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无法看到构造函数实现。它只看到标题中的声明。
您有不同的选择:
Array.cpp: 中显式实例化模板来限制您的类与类型的严格子集一起使用,例如:
template class Array<int>;在文件范围内。对于容器类型,这似乎不是一个选项。Array.cpp(但我会Array_Impl.hpp在你的标题末尾调用它(但你必须小心,因为 cpp 中的所有内容都将在标题中可见,并且对于包含你的所有文件)标题)正确的语法是
Array<T>::Array()
Run Code Online (Sandbox Code Playgroud)
不
Array<T>::Array<T>()
Run Code Online (Sandbox Code Playgroud)
相关说明,在.cpp文件中实现模板几乎总是错误的。
std::vector无论如何,您都应该使用。