C++;非模板类型的显式实例化 我正在读一本关于C++的书。我仍然很公平,但我仍在努力把基本的事情做好。本节涉及继承,目标是创建一个shape类,然后使用第一个二维形状在其上构建,然后使用二维形状构建三维形状

C++;非模板类型的显式实例化 我正在读一本关于C++的书。我仍然很公平,但我仍在努力把基本的事情做好。本节涉及继承,目标是创建一个shape类,然后使用第一个二维形状在其上构建,然后使用二维形状构建三维形状,c++,templates,inheritance,C++,Templates,Inheritance,到目前为止,我已经能够一路向上完成二维图形。那里的功能运行良好。我现在转向三维形状,这就是我遇到的一个问题 这本书说要实现一个系统,允许长度、高度和三维宽度为int或float,所以我在其中加入了一个模板。这就是我遇到问题的地方 我确实复制了二维类,并通过二维类进入三维类,然后尝试从那里完成它。然后我运行它来解决一点问题 当我试图编译时,我得到两个主要错误 错误:“ThreeD”不是类模板 错误:非模板类型“ThreeD”的显式实例化 我认为这是需要提交相关信息的最小部分。请记住,main.cp

到目前为止,我已经能够一路向上完成二维图形。那里的功能运行良好。我现在转向三维形状,这就是我遇到的一个问题

这本书说要实现一个系统,允许长度、高度和三维宽度为int或float,所以我在其中加入了一个模板。这就是我遇到问题的地方

我确实复制了二维类,并通过二维类进入三维类,然后尝试从那里完成它。然后我运行它来解决一点问题

当我试图编译时,我得到两个主要错误

错误:“ThreeD”不是类模板 错误:非模板类型“ThreeD”的显式实例化

我认为这是需要提交相关信息的最小部分。请记住,main.cpp、shape.h、shape.cpp、twod.h和twod.cpp按原样工作,但我包含了完整的标题,而不是完整的其他cpp

你能提供的任何帮助都会很好

我将3d.cpp放在顶部,因为这就是错误的来源

我不认为这是“为什么模板只能在头文件中实现?”的重复,因为代码可以在TwoD类中正常工作,而不是在ThreeD类中

三维cpp

#include <iostream>
#include <string>
#include "shape.h"
#include "TwoD.h"

using namespace std;

template class ThreeD<int>;
template class ThreeD<float>;


    template <class T>
    ThreeD<T>::ThreeD (string oobj, int osides, T olength, T oheight, T owidth)
        : TwoD<T>(oobj, osides, olength, oheight)
    {
        setObject(obj);
        setSides(sides);
        setLength(length);
        setHeight(height);
        setWidth(owidth);
    } //End of TwoD constructor

template <class T>
int ThreeD<T>::getSides() {
    return sides;
} //End of function getSides
#包括
#包括
#包括“shape.h”
#包括“TwoD.h”
使用名称空间std;
模板类3d;
模板类3d;
模板
3D::3D(字符串oobj、整数、T长度、T高度、T宽度)
:TwoD(oobj、osides、OleLength、OhHeight)
{
setObject(obj);
侧边(侧边);
设定长度(长度);
设置高度(高度);
设置宽度(宽度);
}//二维构造函数的结尾
模板
int-ThreeD::getSides(){
返回侧;
}//函数getSides结束
main.cpp

#include <iostream>
#include "shape.h"
#include "TwoD.h"
#include "ThreeD.h"

using namespace std;

int main() {


TwoD<float> triangle("Triangle", 3, 3, 3);

ThreeD<float> cube("Cube", 6, 3, 3, 3);
}
#包括
#包括“shape.h”
#包括“TwoD.h”
#包括“3D.h”
使用名称空间std;
int main(){
二维三角形(“三角形”,3,3,3);
三维立方体(“立方体”,6,3,3,3);
}
形状.h

#ifndef SHAPE_H
#define SHAPE_H

#include <string>

using namespace std;

//Implimenting template <class T> as a means to have the sides
//variable become either a float or an int.
template <class T>
class Shape {

public:
    Shape(string, int, T);
//    void setObject(string); //Used to ensure constructor works
    virtual void setObject(string) = 0;
//Used setObject as virtual function since constructor uses it to
//Make the object using the setObject function.
    string getObject();
    int getSides();
    bool setSides(int);
    float getLength();
    void setLength (T);

    float getPerimeter(string, T);
    float getArea (string, T);

    void display();
private:
    string object;
    int sides;
    T length;
};

#endif
\ifndef SHAPE\u H
#定义形状
#包括
使用名称空间std;
//将模板作为一种方法来实现
//变量变为浮点或整数。
模板
阶级形态{
公众:
形状(字符串、int、T);
//void setObject(string);//用于确保构造函数工作
虚拟空集合对象(字符串)=0;
//使用setObject作为虚拟函数,因为构造函数使用它来
//使用setObject函数创建对象。
字符串getObject();
int getSides();
布尔集合码(int);
float getLength();
空隙长度(T);
浮球周长(串,T);
浮动区域(字符串,T);
void display();
私人:
字符串对象;
内侧面;
T长度;
};
#恩迪夫
Shape.cpp

#include <iostream>
#include <string>
#include "shape.h"

using namespace std;

//Telling the compiler template class of Shape which versions for T to
//expect either int or float.
template class Shape<int>;
template class Shape<float>;

//Constructor of Shape. Inputs shape, sides, and length.
    template <class T>
    Shape<T>::Shape (string shapes, int sides, T length){
        setObject(shapes);
        setSides(sides);
        setLength(length);
    } //End of Shape constructor
#包括
#包括
#包括“shape.h”
使用名称空间std;
//告诉编译器模板类Shape的T要使用哪个版本
//应为int或float。
模板类形状;
模板类形状;
//形状的构造器。输入形状、边和长度。
模板
形状::形状(字符串形状、整数边、T长度){
设置对象(形状);
侧边(侧边);
设定长度(长度);
}//形状构造函数的结尾
两个

#ifndef TWOD_H
#define TWOD_H

#include <string>
#include "shape.h"

using namespace std;

//Implimenting template <class T> as a means to have the sides
//variable become either a float or an int.
template <class T>
class TwoD : public Shape<T>
{

public:
    TwoD(std::string, int, T, T);
    void setObject(string); //Used to ensure constructor works
//    virtual void setObject(string) = 0;
//Used setObject as virtual function since constructor uses it to
//Make the object using the setObject function.
    string getObject();
    int getSides();
    bool setSides(int);
    T getLength();
    void setLength (T);
    T getHeight();
    void setHeight (T);

    float getPerimeter(string, T, T);
    float getArea (string, T, T);

    void display();
private:
    string object;
    int sides;
    T length;
    T height;
};

#endif
\ifndef two\u H
#定义二维
#包括
#包括“shape.h”
使用名称空间std;
//将模板作为一种方法来实现
//变量变为浮点或整数。
模板
第二类:公众形象
{
公众:
TwoD(std::string,int,T,T);
void setObject(string);//用于确保构造函数工作
//虚拟空集合对象(字符串)=0;
//使用setObject作为虚拟函数,因为构造函数使用它来
//使用setObject函数创建对象。
字符串getObject();
int getSides();
布尔集合码(int);
T getLength();
空隙长度(T);
T getHeight();
空隙高度(T);
浮点数(字符串,T,T);
浮动区域(字符串,T,T);
void display();
私人:
字符串对象;
内侧面;
T长度;
T高度;
};
#恩迪夫
两个D.cpp

#include <iostream>
#include <string>
#include "shape.h"
#include "TwoD.h"

using namespace std;

//Telling the compiler template class of TwoD which versions for T to
//expect either int or float.
template class TwoD<int>;
template class TwoD<float>;

//Constructor of TwoD. Inputs TwoD, sides, and length.
    template <class T>
    TwoD<T>::TwoD (string obj, int sides, T length, T height)
        : Shape<T>(obj, sides, length)
    {
        setObject(obj);
        setSides(sides);
        setLength(length);
        setHeight(height);
    } //End of TwoD constructor
#包括
#包括
#包括“shape.h”
#包括“TwoD.h”
使用名称空间std;
//告诉TwoD的编译器模板类T的版本
//应为int或float。
模板类TwoD;
模板类TwoD;
//二维的构造函数。输入TwoD、side和length。
模板
TwoD::TwoD(字符串对象、整数边、T长度、T高度)
:形状(长方体、侧面、长度)
{
setObject(obj);
侧边(侧边);
设定长度(长度);
设置高度(高度);
}//二维构造函数的结尾
三维h

#ifndef THREED_H
#define THREED_H

#include <string>
#include "shape.h"
#include "TwoD.h"

using namespace std;

//Implimenting template <class T> as a means to have the sides
//variable become either a float or an int.
template <class T>
class ThreeD : public TwoD<T>
{

public:
    ThreeD(std::string, int, T, T, T);
    void setObject(std::string); //Used to ensure constructor works
//    virtual void setObject(string) = 0;
//Used setObject as virtual function since constructor uses it to
//Make the object using the setObject function.
    string getObject();
    int getSides();
    bool setSides(int);
    T getLength();
    void setLength (T);
    T getHeight();
    void setHeight (T);

    T getWidth();
    void setWidth (T);

    float getPerimeter(string, T, T, T);
    float getArea (string, T, T, T);

    void display();
private:
    std::string object;
    int sides;
    T length;
    T height;
    T width;
};

#endif
\ifndef THREED\u H
#定义三维
#包括
#包括“shape.h”
#包括“TwoD.h”
使用名称空间std;
//将模板作为一种方法来实现
//变量变为浮点或整数。
模板
第三类D:公共二类D
{
公众:
三维(std::string,int,T,T,T);
void setObject(std::string);//用于确保构造函数工作
//虚拟空集合对象(字符串)=0;
//使用setObject作为虚拟函数,因为构造函数使用它来
//使用setObject函数创建对象。
字符串getObject();
int getSides();
布尔集合码(int);
T getLength();
空隙长度(T);
T getHeight();
空隙高度(T);
T getWidth();
空隙宽度(T);
浮点数(字符串,T,T,T);
浮动区域(字符串,T,T,T);
void display();
私人:
std::字符串对象;
内侧面;
T长度;
T高度;
T宽;
};
#恩迪夫
中的
#include "ThreeD.h"