Я получил класс с шаблонными методами, который смотрит на это:
struct undefined {};
template<typename T> struct is_undefined : mpl::false_ {};
template<> struct is_undefined<undefined> : mpl::true_ {};
template<class C>
struct foo {
template<class F, class V>
typename boost::disable_if<is_undefined<C> >::type
apply(const F &f, const V &variables) {
}
template<class F, class V>
typename boost::enable_if<is_undefined<C> >::type
apply(const F &f, const V &variables) {
}
};
по-видимому, оба шаблона инстанцируют, приводя к ошибке времени компиляции. действительно ли инстанцирование шаблонных методов отличается от инстанцирования бесплатных функций? Я зафиксировал это по-другому, но я хотел бы знать то, что произошло. единственная вещь, о которой я могу думать, который мог бы вызвать это поведение, включив условие, не зависит непосредственные аргументы шаблона, а скорее аргументы шаблона класса
Спасибо
Ваш C
не участвует в вычете за применять
. Смотрите этот ответ для более глубокого объяснения того, почему ваш код не работает.
Вы можете решить эту проблему следующим образом:
template<class C>
struct foo {
template<class F, class V>
void apply(const F &f, const V &variables) {
apply<F, V, C>(f, variables);
}
private:
template<class F, class V, class C1>
typename boost::disable_if<is_undefined<C1> >::type
apply(const F &f, const V &variables) {
}
template<class F, class V, class C1>
typename boost::enable_if<is_undefined<C1> >::type
apply(const F &f, const V &variables) {
}
};