模板化会抛出很多错误

时间:2011-05-25 14:40:15

标签: c++ templates

我正在为我的一个项目创建一个帮助程序命名空间,我希望它能够使用所有类型,如整数,浮点数,双精度等。但似乎我不能正确地模板化。

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

#include "..\util\Logger.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

2 个答案:

答案 0 :(得分:2)

如果您为int传入T,则您的deg / rad转换功能无法正常工作,因为PI会在转换前被截断为int。我无法弄清楚为什么你有那个。

如果min位于任何地方,使用maxusing namespace等变量名称会导致问题。

abs }功能在if上缺少结束{{1}}。这可能会导致呼叫点出错。

答案 1 :(得分:1)

if错过了大括号。

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