C++ 模板
本帖最后由 hellomyprogram 于 2023-10-6 17:22 编辑graphics.h
namespace graph
{
template <typename position_type = int>
class Dot
{
public:
position_type x = 0;
position_type y = 0;
};
class Rect
{
enum relative_pos
{
TopLeft = 0b0000,
TopMiddle,
TopRight,
MiddleLeft = 0b0100,
Center,
MiddleRight,
BottomLeft = 0b1000,
BottomMiddle,
BottomRight
};
public:
Dot<> position = {0, 0};
unsigned int width;
unsigned int height;
Rect(unsigned int, unsigned int);
Rect(int, int, unsigned int, unsigned int);
Dot<> get_absolute(relative_pos);
Dot<> get_absolute(Dot<>);
void set_absolute(relative_pos, Dot<>);
Dot<> set_absolute(Dot<>, Dot<>);
};
};
graphics.cpp
#include <graphics.h>
Dot<> graph::Rect::get_absolute(relative_pos relative)
{}
编译器凭什么说 Dot 不是模板
Dot 前面没加 graph 命名空间 编译器认为Dot不是模板是因为在graphics.cpp文件中, get_absolute函数的定义没有指定模板参数。在 C++ 中,模板类的成员函数的定义也需要指定模板参数。
要解决这个问题,可以将get_absolute函数的定义也改为模板函数,并指定相应的模板参数。修改后的代码如下:
template <typename position_type>
Dot<position_type> graph::Rect::get_absolute(relative_pos relative)
{}
这样编译器就能正确识别Dot是一个模板类,并且能够根据指定的模板参数进行实例化。 编译器报错是因为在 graphics.cpp 文件中,Dot 类型没有提供模板参数。Dot 是一个模板类,因此在使用它时,需要提供相应的模板参数。在这个例子中,Dot 类型的默认模板参数是 int,所以你可以使用 Dot<int> 或者简写为 Dot<>。
为了解决这个问题,你需要在 graphics.cpp 文件中的 get_absolute 函数定义中使用 Dot<> 类型。修改后的代码如下:
#include <graphics.h>
Dot<> graph::Rect::get_absolute(relative_pos relative) {
// 函数实现
}
请注意,你还需要在 graphics.h 和 graphics.cpp 文件中添加正确的命名空间,以便正确地引用 Dot 和 Rect 类。在这个例子中,我假设你使用了 graph 命名空间。如果你使用了其他命名空间,请相应地进行修改。
请注意,本回答来自GPT-4
如果问题已经解决,请设置最佳答案
页:
[1]