模板类构造函数采用参数时出错

Error with template class constructor taking arguments

本文关键字:参数 出错 构造函数      更新时间:2023-10-16

我一直在互联网上寻找解决问题的方法,但没有找到一个像我(我认识)这样的示例问题。

我正在尝试为我的模板类创建一个简单的构造函数,但我的语法或实现一定有问题,因为我在测试它时不断收到相同的编译错误。这似乎与我传递参数的方式有关,因为如果我创建一个没有参数的对象,它可以很好地编译(这似乎很奇怪,因为我没有不接受参数的构造函数)。

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

测试.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)

非常感谢您的时间,我感谢我能就此事获得的任何建议。

这个:

template <class T>
class VecXd : public VecXd<T> {

应该是

template <class T>
class VecXd {

因为首先这意味着类型是从自身派生的 - 这永远无法工作。该错误是指不完整的基类,因为它是您自己声明的类。

似乎有效的是

VecXd<int> tVec();

仅仅因为这是一个函数声明。如果要有一个真实实例,请去掉括号:

VecXd<int> tVec;

您将遇到原始代码的错误。