hellomyprogram 发表于 2023-10-6 14:46:04

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 命名空间

isdkz 发表于 2023-10-6 14:46:20

编译器认为Dot不是模板是因为在graphics.cpp文件中, get_absolute函数的定义没有指定模板参数。在 C++ 中,模板类的成员函数的定义也需要指定模板参数。

要解决这个问题,可以将get_absolute函数的定义也改为模板函数,并指定相应的模板参数。修改后的代码如下:

template <typename position_type>
Dot<position_type> graph::Rect::get_absolute(relative_pos relative)
{}


这样编译器就能正确识别Dot是一个模板类,并且能够根据指定的模板参数进行实例化。

陶远航 发表于 2023-10-6 14:46:33

编译器报错是因为在 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]
查看完整版本: C++ 模板