2014-02-08 107 views
2

我希望能夠專注一類的構造函數的方式如下:可變參數模板的構造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

成員函數和擴展構造並不擅長,能夠在不完全專業外模板。

只要寫一個int不是模板的ctor就可以在這裏使用。

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."