У меня есть проблемы с помощью следующей конструкции:подталкивания list_of с аргументами по умолчанию
struct A {
int min_version;
int max_version;
std::vector<int> nodes;
A(std::vector<int> _nodes, int _min_version = 0, int _max_version = MAXINT)
: nodes(_nodes), min_version(_min_version), max_version(_max_version)
{};
};
static std::vector<A> a = list_of<A>
(list_of (1) (2))
;
я получаю ошибку компиляции, что ни один из 2-х перегрузок не может конвертировать все типы аргументов (Visual Studio 2013). Однако, когда я добавляю значение для аргументов один или оба по умолчанию, он отлично компилируется:
static std::vector<A> a = list_of<A>
(list_of (1) (2), 1)
;
Итак, что же трюк, чтобы сделать аргументы как по умолчанию работает?
Это замечательный. Но после вашего объяснения это действительно имеет смысл. Тем не менее, для меня загадка, как неправильный вывод может быть лучшим, если существует очевидный. –
@MikeLischke Проблема в том, что неправильный еще более очевидный, чем тот, который вы хотите. По существу, у вас есть 'struct A {template оператор T(); } ',' struct B {} 'и' struct C {C (B); } '. Основываясь только на объявлениях, когда у вас есть 'A', и вы хотите' C', наиболее очевидным способом получить его является вызов оператора преобразования шаблонов. Будет ли это действительно работать, неизвестно, есть ли у вас просто объявления. То, что вы хотите, конструктор 'C (B)' после использования оператора преобразования шаблонов для получения 'B', является только вторым самым очевидным способом. Тем не менее ... –
hvd
... Я думаю, что я ошибался в предположении, что SFINAE будет невозможно. В этом случае это просто плохой дизайн 'list_of', и он * может * альтернативно быть спроектирован таким образом, чтобы ваш код работал, я теперь думаю. Но так как это не так, вы застряли над проблемой. – hvd