Проблема со специализацией шаблона и параметрами шаблона - PullRequest
0 голосов
/ 26 сентября 2010

У меня есть класс Helper:

template <typename T, template <typename> E>
class Helper {
    ...
};

У меня есть другой шаблон класса, Exposure, который должен наследоваться от Helper, передавая себя в качестве параметра шаблона шаблона E. Мне также нужно специализироваться Exposure. Поэтому я хочу написать что-то вроде следующего:

template <>
class Exposure<int> : public Helper<int, Exposure> {
    Exposure() : Helper<int, Exposure>() {
        ...
    };
    ...
};

К сожалению, это не скомпилируется. GCC жалуется:

Exposure.h: 170: ошибка: несоответствие типа / значения в аргументе 2 в списке параметров шаблона для «шаблона> класса ExposureHelper»

Exposure.h: 170: ошибка: ожидается постоянная типа ‘’, получена ‘Exposure’

Я что-то не так делаю? Есть ли обходной путь для того, что я пытаюсь сделать?

Ответы [ 2 ]

2 голосов
/ 26 сентября 2010

, если вы действительно хотите передать шаблон вместо класса

template <typename T, template<typename> class E>
class Helper {
};

template <typename T>
class Exposure;

template <>
class Exposure<int> : public Helper<int, Exposure > {
};

или если ваше намерение отличается

template <typename T, typename E>
class Helper {
};

template <typename T>
class Exposure;

template <>
class Exposure<int> : public Helper<int, Exposure<int> > {
};
0 голосов
/ 26 сентября 2010

В вашем первом шаблоне для Помощника вам не нужно говорить, что второй параметр - это шаблон:

template <typename T, typename E>
class Helper {
    ...
};

И вы можете объявить его с шаблоном в качестве аргумента:

Helper<vector<int>, vector<char> > h;

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

...