Variadic шаблон конструктор специализация в шаблоне класса
Я хочу иметь возможность специализировать ctor класса следующим образом:
template<typename T>
class Foo {
public:
template<typename... Ts>
Foo(Ts... & args) {
// ...
}
template<>
Foo(int i) {
// ...
}
};
Я получаю следующую ошибку:
ошибка: явная специализация в области отсутствия пространства имен 'class Foo'
Если я попытаюсь перенести специализацию за пределы класса, вот так:
template<typename T>
class Foo {
public:
template<typename... Ts>
Foo(Ts &... args) {
// ...
}
};
template<typename T>
template<int>
Foo<T>::Foo(int i) {
// ...
}
Я получаю следующие ошибки:
ошибка: прототип для 'Foo::Foo(int)' не соответствует ни одному в классе 'Foo'
ошибка: кандидат есть: шаблон шаблона Foo::Foo(Ts& ...)
Как мне сделать это правильно?
2 ответа
Вы можете просто перегрузить конструктор:
template<typename T>
class Foo {
public:
template<typename... Ts>
Foo(Ts&... args) {
// ...
}
// template<> <- REMOVE THIS
Foo(int i) {
// ...
}
};
При разрешении перегрузки предпочтение будет отдаваться не шаблонной перегрузке. Foo<MyType> f(1234);
выбрал бы Foo<MyType>::Foo(int);
,
ПРИМЕР ЖИВАЯ (я изменил вариант const
для того, чтобы принять временные служения ради примера).
Обратите внимание, что позиция модификатора типа в вашей функции переменной неправильна. Это должно быть с типом, на левой стороне ...
:
Foo(Ts&... args)
Функция-член и конструкторы расширений не могут специализироваться без полной специализации внешнего шаблона.
Просто напишите ctor с int, а не с шаблоном.
14.7.3p18: "В явном объявлении специализации для члена шаблона класса или шаблона члена, который появляется в области пространства имен, шаблон члена и некоторые из его вмещающих шаблонов класса могут остаться не специализированными, за исключением того, что объявление не должно явно специализовать шаблон члена класса, если его вложенные шаблоны классов также не являются явно специализированными."