Шаблонные статические функции-члены в C ++ - PullRequest
4 голосов
/ 27 ноября 2011

Я написал простую тестовую программу, чтобы попытаться узнать, как использовать шаблонные статические функции-члены в C ++. Код компилируется, но не работает правильно (выводит мусор). Я думаю, что я использую правильный синтаксис. Я прочитал это или это и некоторые другие вещи, но все еще не знаю, что я делаю неправильно. Код ниже:

#include <iostream>
using namespace std;

class Util {
public:
    Util();
    virtual ~Util();

    template <typename T> static void printTab(T tab[]);
};

template <typename T>
void Util::printTab(T tab[]) {
    for (unsigned int i=0; i<sizeof(tab)/sizeof(tab[0]); i++) {
        cout << tab[0] << " ";
    }
    cout << endl;
}

int main() {

    float tabFloat[5] {1, 2, 3, 4, 5};
    unsigned char tabChar[3] {1, 2, 3};

    Util::printTab(tabFloat);
    Util::printTab(tabChar);

    return 0;
}

Любые намеки приветствуются.

Ответы [ 4 ]

5 голосов
/ 27 ноября 2011

Вам нужно передать размер в качестве другого аргумента шаблона:

#include <iostream>
using namespace std;

class Util {
public:
    Util();
    virtual ~Util();

    template <typename T,int N> static void printTab(T (&tab)[N])
    {
        for (int i=0; i<N; i++) {
            cout << tab[i] << " ";
        }
        cout << endl;
    }
};

int main() {

    float tabFloat[5] {1, 2, 3, 4, 5};
    unsigned char tabChar[3] {1, 2, 3};

    Util::printTab(tabFloat);
    Util::printTab(tabChar);
}
2 голосов
/ 27 ноября 2011

sizeof(tab) - это размер T*, он не будет возвращать размер всего массива.Вам нужно передать это в себе как еще один аргумент функции.Смотрите здесь для объяснения и другого возможного обходного пути: Если функция имеет параметр массива определенного размера, почему она заменяется указателем?

Обратите внимание, что второй printTab не будетвывод читаемых символов.Если вы хотите увидеть что-то распечатанное, попробуйте:

 unsigned char tabChar[3] {'1', '2', '3'};
1 голос
/ 27 ноября 2011

Как насчет попытки, вам нужно отправить размер массива при вызове функции:

#include <iostream>
using namespace std;

class Util {
public:
    Util();
    virtual ~Util();

    template <typename T> static void printTab(T tab[], size_t sz);
};

template <typename T>
void Util::printTab(T tab[], size_t sz) {
    for (unsigned int i=0; i<sz; i++) {
        cout << tab[i] << " ";
    }
    cout << endl;
}

int main() {

    float tabFloat[5] {1, 2, 3, 4, 5};
    unsigned char tabChar[3] {1, 2, 3};

    Util::printTab(tabFloat, sizeof(tabFloat)/sizeof(float));
    Util::printTab(tabChar, sizeof(tabChar)/sizeof(char));

    return 0;
}
0 голосов
/ 27 ноября 2011

Я бы передал число элементов T в качестве аргумента функции или использовал бы контейнер STD, такой как Vector.

Ваша for петля просто печатает первый элемент tab[0], а не tab[i]

Отсутствует ваша инициализация tabFloat и tabChar =

float tabFloat[5] {1, 2, 3, 4, 5}; 
unsigned char tabChar[3] {1, 2, 3};

(также я бы использовал 65, 66, 67 вместо 1,2,3 для удобства чтения консоли при тестировании)

float tabFloat[5] = {1, 2, 3, 4, 5}; 
unsigned char tabChar[3] = { 65, 66, 67}; 
...