2014-02-08 4 views
2

Я хочу, чтобы иметь возможность специализировать CTOR класса следующим образом:VARIADIC шаблон конструктор speciliazation в шаблон класса

template<typename T> 
class Foo { 
public: 
    template<typename... Ts> 
    Foo(Ts... & args) { 
    // ... 
    } 

    template<> 
    Foo(int i) { 
    // ... 
    } 
}; 

Я получаю следующее сообщение об ошибке:

error: explicit specialization in non-namespace scope ‘class Foo’

Если я пытаюсь переместить специализацию вне класса, как это:

template<typename T> 
class Foo { 
public: 
    template<typename... Ts> 
    Foo(Ts &... args) { 
    // ... 
    } 
}; 

template<typename T> 
template<int> 
Foo<T>::Foo(int i) { 
    // ... 
} 

я получаю следующие ошибки:

error: prototype for ‘Foo::Foo(int)’ does not match any in class ‘Foo’

error: candidate is: template template Foo::Foo(Ts& ...)

Как это сделать правильно?

+2

Не специализируйтесь. Перегрузите его. – WhozCraig

ответ

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);.

LIVE EXAMPLE (Я использовал модификатор, чтобы быть const, чтобы он принимал временные значения для примера).

Обратите внимание, что положение модификатора типа в вашей вариационной функции неверно. Он должен быть с типом, на левой стороне ...:

Foo(Ts&... args) 
1

функции члена и расширение конструкторов не специализируется-состояние без полного Специализируя внешний шаблон.

Просто напишите ctor с помощью шаблона int без шаблонов.

14.7.3p18: "In an explicit specialization declaration for a member of a class template or a member template that appears in namespace scope, the member template and some of its enclosing class templates may remain unspecialized, except that the declaration shall not explicitly specialize a class member template if its enclosing class templates are not explicitly specialized as well."

Смежные вопросы