Создание шаблонов приводит к множеству ошибок

#c #templates

#c #шаблоны

Вопрос:

Я создаю вспомогательное пространство имен для одного из своих проектов, я хотел, чтобы оно могло использовать все типы, такие как целые числа, числа с плавающей точкой, удвоения и т.д. Но, похоже, я просто не могу правильно настроить шаблоны.

В любом случае, вот мой текущий код, мой компилятор не выдает ошибок в самом файле, хотя, когда я его компилирую, он выдает сотни ошибок в других файлах. Эти ошибки отсутствуют, когда я удаляю шаблоны в файле:

 #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

Комментарии:

1. Какие ошибки? Кроме того, не используйте обратную косую черту во включаемых.

2. Мне действительно пришлось посмеяться, когда я прочитал название этого вопроса.

3. Почему вы используете шаблоны? Вы ожидаете, что люди будут передавать строку или Employee этим функциям? Вы пишете это только для практики? Если вам просто нужно абсолютное значение чего-либо, это уже сделано. Наконец, покажите первый набор ошибок и строку вызывающего кода, которая их вызывает.

4. Просто посмотрите на Deg2Rad и Rad2Deg — если я передаю целое число одному из них, почему это означает, что я хочу вернуть целое число обратно? Я бы просто заставил эти методы принимать и возвращать двойные значения, а затем полагаться на продвижение аргументов.

5. Не используйте pastebin, разместите их здесь!

Ответ №1:

Ваши функции преобразования deg / rad не будут работать правильно, если вы передадите int for T , потому что PI будет усечен до int перед выполнением преобразования. Я не совсем понимаю, почему у вас это есть.

Использование имен переменных, таких как min и max , вызовет проблемы, если у вас есть using namespace где угодно.

В вашей abs функции отсутствует закрытие } для if . Это может привести к ошибкам в точке вызова.

Ответ №2:

В if пропущена фигурная скобка.

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