Неуказанный аргумент шаблона - PullRequest
2 голосов
/ 06 июня 2011

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

template <typename A, typename B>
class Component {

};

template <typename A>
class Context {
    public:
        void add(Component<A, void *> comp) {
        }
}

typedef struct Foo { int x; } Foo;
typedef struct Bar { int y; } Bar;
Context<Foo> *context = new Context<Foo>();
Component<Foo, Bar> *comp = new Component<Foo, Bar>();
context->add(comp); // error

Но компилятор жалуется, что не может преобразовать Component<Foo, Bar> в Component<Foo, void *>.Есть ли способ сделать это?

Ответы [ 3 ]

1 голос
/ 06 июня 2011

Я думаю, что вам, вероятно, нужно изменить сигнатуру метода add:

template <typename A>
class Context
{
public:
  template<class B>
  void add(Component<A, B> comp)
  {           
  }
};

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

0 голосов
/ 06 июня 2011

Я пытаюсь использовать шаблоны с несколькими для передачи данных в функцию, но использую только первый аргумент шаблона в качестве фильтра. [...] Но компилятор жалуется, что не может преобразовать Компонент в Компонент. Есть ли способ сделать это?

Что ж, ваш фильтр работает, не так ли: ваша функция add будет соответствовать только компоненту, чей второй параметр шаблона равен void*, а вы предоставляете Bar. Чего еще можно ожидать? Если вы хотите, чтобы он обрабатывал и другие «вторые параметры», либо удалите фильтр, либо предоставьте резервную функцию для сопоставления, либо какое-либо преобразование.

0 голосов
/ 06 июня 2011

Да, добавьте конструктор конвертирующих копий к вашему Component:

template<class U, class V>
Component(Component<U,V> const& other){
  // ...
};

Но это все еще можно исправить с помощью соответствующей enable_if SFINAE защиты:

// <tr1/type_traits> for C++03
#include <type_traits> // for C++0x

template<class T, class U>
struct can_convert{
  // std::tr1::... for C++03
  static bool const value =
      std::is_same<T,U>::value || std::is_convertible<T,U>::value;
};

template<class C1, class C2>
struct ice_and{
  static bool const value = C1::value && C2::value;
}

// define for clarity and brevity
#define IF_CAN_CONVERT(A,B,U,V) \
  typename std::enable_if<ice_and<can_convert<A,U>,can_convert<B,V> > >::type* = 0

template<class U, class V>
Component(Component<U,V> const& other, IF_CAN_CONVERT(A,B,U,V)){
  // ...
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...