Как я могу реорганизовать мою библиотеку, чтобы включить шаблоны? - PullRequest
0 голосов
/ 23 августа 2011

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

Старая версия использовала жестко закодированный float для сохранения значений для x, y и z.Сейчас я пытаюсь сделать так, чтобы класс также мог использовать double через шаблон.

Мое определение класса выглядит следующим образом:

namespace alg {

template <class T=float> // <- note the default type specification
struct vector
{
    T x, y, z;
    vector() : x(0), y(0), z(0) {}
    explicit vector(T f) : x(f), y(f), z(f) {}
    vector(T x, T y, T z) : x(x), y(y), z(z) {}

    // etc
};

}

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

Однако я все еще получаю ошибки об отсутствующих аргументах шаблона...

#include "vector.hpp"

int main() {
    alg::vector a;
    return 0;
}

-

$ g++ -O3 -Wall -Wextra -std=gnu++0x test.cpp
test.cpp: In function ‘int main()’:
test.cpp:4:17: error: missing template arguments before ‘a’
test.cpp:4:17: error: expected ‘;’ before ‘a’

Как заставить этот код работать без изменения test.cpp?Желательно без указания названия struct и использования typedef

Ответы [ 3 ]

5 голосов
/ 23 августа 2011

Ссылка на шаблон класса без угловых скобок, к сожалению, недопустима.

То, как STL делает это с std::string, похоже на это, даже если ваш запрос был "без искажения":

template <typename T> class basic_string { ... };
...
typedef basic_string<char> string; 

В вашем случае вам придется написать vector<> везде или переименовать Шаблон:

template <class T>
struct basic_vector {
    ...
};

typedef basic_vector<float> vector;
2 голосов
/ 23 августа 2011

К сожалению, вы должны написать alg::vector<>, даже если у вас есть имя по умолчанию.

0 голосов
/ 23 августа 2011

за весь мой опыт вы не можете.вам нужно изменить alg::vector на alg::vector<>, что является синтаксисом для аргумента по умолчанию.хотя одноразовый поиск и замена должны сделать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...