我一直在寻找解决我的问题的互联网,但没有找到一个像我一样的例子问题(我认识到)。
我正在尝试为我的模板类创建一个简单的构造函数,但是我的语法或实现一定有问题,因为我在测试它时会遇到相同的编译错误。它似乎与我传递参数的方式有关,因为如果我创建一个没有参数的对象,它编译得很好(这看起来很奇怪,因为我没有不带参数的构造函数)。
vecxd.hpp:
#ifndef JF_VecXd
#define JF_VecXd
template <class T>
class VecXd : public VecXd<T>{
public:
VecXd(T a, T b, T c);
private:
T x, y, z;
};
template <class T>
VecXd<T>::VecXd(T a, T b, T c){
x = a;
y = b;
z = c;
}
#endif
test.cpp:
#include "vecxd.hpp"
int main(){
int a = 3, b = 4, c = 5;
VecXd<int> tVec(a,b,c);
return 0;
}
错误:
3 vecxd.hpp无效使用未定义类型`class VecXd'
但是当我创建没有参数的对象时它会编译,如下所示:
int a = 1, b = 2, c = 3;
VecXd<int> tVec();
//Instead of this: VecXd<int> tVec(a, b, c)
非常感谢您的时间,我感谢您就此事提出任何建议。
答案 0 :(得分:5)
此:
template <class T>
class VecXd : public VecXd<T> {
应该是
template <class T>
class VecXd {
因为这首先意味着类型是从自身派生出来的 - 它永远不会起作用。该错误指的是不完整的基类,因为它是您自己声明的类。
似乎的工作原理是
VecXd<int> tVec();
只是因为这是一个函数声明。如果您想拥有一个真实实例,请删除括号:
VecXd<int> tVec;
您将使用原始代码遇到错误。