Как определить шаблонный метод для не шаблонного класса? - PullRequest
4 голосов
/ 18 января 2011

Мой компилятор недоволен тем, как я реализую свои методы шаблона. Это дает тонн сообщений об ошибках, таких как "неопределенный тип T" для этих реализаций.

Это мой первый метод, он реализован вне блока класса:

class VectorConvertor
{
    public:
        // ...
        template <class T>
        static void ReverseVectorElements(std::vector<T> & Vector);
        // ...
};

template <class T>
void VectorConvertor::ReverseVectorElements(std::vector<T> & Vector)
{
    std::vector<T>::size_type size = Vector.size();
    T swap;
    for (std::vector<T>::size_type i=0; i<size/2; i++)
    {
        swap = Vector.at(i);
        Vector.at(i) = Vector.at(size-1-i);
        Vector.at(size-1-i) = swap;
    }
}

Еще один такой; на этот раз метод реализован внутри класса:

class ElementaryMath
{
    public:
        // ...
        template <class T> static char sign(T num)
        {
            return (num >= static_cast<T>(0)) ? static_cast<char>(+1) : static_cast<char>(-1);
        }
        // ...
}

Что-то не так с моим кодом или это просто проблема с самим компилятором?

IDE и компилятор: Visual Studio 2010

Ответы [ 5 ]

5 голосов
/ 18 января 2011

Ваш код выглядит нормально для меня.Но есть одна вещь, которая пришла мне в голову.Можете ли вы проверить, определена ли ранее функция «знак»?Просто наведите на нее мышью.Библиотека времени выполнения C реализует некоторые из своих функций, используя ключевое слово "#define", и поэтому впоследствии вы не можете определить функцию с тем же именем.

4 голосов
/ 18 января 2011

Вам не хватает некоторых typename с и точек с запятой, но в остальном код кажется нормальным.ИМХО, пришло время подать ошибку, если она все еще не работает.

Кстати, код подкачки лучше бы сделать с std::swap.

1 голос
/ 18 января 2011
class VectorConvertor
{
    public:
    // ...
    template <typename T>
    static void ReverseVectorElements(std::vector<T> & Vector);
};

template <typename T>
void VectorConvertor::ReverseVectorElements(std::vector<T> & Vector)
{
    std::vector<T>::size_type size = Vector.size();
    T swap;
    for (std::vector<T>::size_type i=0; i<size/2; i++)
    {
        swap = Vector.at(i);
        Vector.at(i) = Vector.at(size-1-i);
        Vector.at(size-1-i) = swap;
    }
}

int main()
{
    std::vector <int> i(10,0);

    VectorConvertor obj;   // Since your class isn't a template, template parameter
                           // isn't required for a class template instantiation.
                           // However, if your class was a template class, template-
                           // parameter must have been required for a class template
                           // instantiation.

    obj.ReverseVectorElements(i);  // Equal to obj.ReverseVectorElements<int>(i);
                                   // Based on type of i, compiler can instantiate a 
                                   // template function by default.
    getchar();
    return 0;
}

Надеюсь, это поможет!

1 голос
/ 18 января 2011

имя здесь:

template <class T>
void VectorConvertor::ReverseVectorElements(std::vector<T> & Vector)
{
    typename std::vector<T>::size_type size = Vector.size();
    T swap;
    for (typename std::vector<T>::size_type i=0; i<size/2; i++)
    {
        swap = Vector.at(i);
        Vector.at(i) = Vector.at(size-1-i);
        Vector.at(size-1-i) = swap;
    }
}
1 голос
/ 18 января 2011

Ваш код без ошибок компилируется на VS2005 (кроме пропущенной точки с запятой в конце определения ElementaryMath), поэтому вы можете посмотреть на ошибку компилятора.

VS2010 SP1 доступен в бета-версии здесь .Может помочь, но, очевидно, его бета ...

...