模板化会抛出很多错误

Templating throws out a lot of errors

本文关键字:错误      更新时间:2023-10-16

我正在为我的一个项目创建一个helper命名空间,我希望它能够使用所有类型,如int、float、doubles等。但我似乎无法正确使用模板。

无论如何,这是我当前的代码,我的编译器不会吐出关于文件本身的错误,尽管当我编译它时,它会在其他文件中吐出数百个错误。当我删除文件中的模板时,这些错误就不存在了:

#include "..utilLogger.hpp"
namespace gm
{
    namespace math
    {
        namespace MathHelper
        {
            // Value of Pi
            const double PI = 3.1415926535897932384626433832795028841972;
            // Value of euler
            const double E =  2.7182818284590452353602874713526624977572;
            // Convert radians to degrees
            template <typename T>
            T Rad2Deg(T angle)
            {
                return angle * (180 / (T)PI);
            }
            // Convert degrees to radians
            template <typename T>
            T Deg2Rad(T angle)
            {
                return angle * ((T)PI / 180);
            }
            // Clamp a value in between the given min and max
            template <typename T>
            T Clamp(T value, T min, T max)
            {
                if(min > max) { gm::util::Logger::DisplayError("Invalid argument in MathHelper::Clamp, max is over min"); }
                if(value < min) { value = min; }
                if(value > max) { value = max; }
                return value;
            }
            // Exponentiate value a with value b
            template <typename T>
            T Exp(T a, int b)
            {
                if(b < 0) { gm::util::Logger::DisplayError("Invalid argument in MathHelper::Exp, b must be positive"); }
                T value = a;
                for(int i = 1; i < b; i++) { value *= a; }
                return value;
            }
            // Get the absolute value of the value passed
            template <typename T>
            T Abs(T a, T b)
            {
                if(value < 0) { value = -value;
                return value;
            }
        };
    };
};

我把编译错误放在这个粘贴中:http://pastebin.com/AxwmDyDh

如果为T传递int,则deg/rad转换函数将无法正常工作,因为在进行转换之前,PI将被截断为int。我不太明白你为什么把它放在里面。

如果您在任何位置都有using namespace,那么使用minmax之类的变量名将导致问题。

您的abs函数在if上缺少一个结束}。这可能会导致调用点出现错误。

if中缺少大括号。

if(value < 0) { value = -value;