2017-01-17 74 views
1

在閱讀了sfinae on member function defined outside of class body(這不是同一個問題)和其他的問題之後,我仍然沒有找到一種很好的方法來定義成員函數的外部類聲明之外,當使用SFINAE方法來啓用只有算術類型的類。如何在類聲明之外定義sfinae類的成員?

#include <type_traits> 

template <typename T,typename = typename std::enable_if<std::is_arithmetic<T>::value,T>::type> 
class foo 
{ 
public: 
    void bar(); 
}; 

template <typename T> 
void foo<T>::bar() 
{ 
} 

在這個例子中,我得到的錯誤:

error: invalid use of incomplete type 'class foo<T>' 
void foo<T>::bar() 
^ 
error: declaration of 'class foo<T>' 
class foo 
^ 

然而,如果我這樣聲明:

#include <type_traits> 

template <typename T,typename = typename std::enable_if<std::is_arithmetic<T>::value,T>::type> 
class foo 
{ 
public: 
    void bar() 
    { 
    } 
}; 

它的功能不用任何麻煩。

我正在使用mingw-w64(w64 3.3)編譯此代碼。

回答

2

foo有兩個模板參數,即使其中一個未命名,默認和用於SFINAE。因此:

template <typename T, typename U> 
void foo<T, U>::bar() 
{ 
} 
+0

在這種情況下,如果您聲明一個函數以兩個foo作爲const ref參數,您不需要指定第二個typename? –

+0

@PierreAntoineGuillaume如'void baz(foo const&)'?這是因爲它只是使用(實例化)'foo'。另一方面,定義'foo'需要你清楚你所關注的是哪部分'foo'。你的語法*可能意味着「使用默認參數」,但在你的情況下,你會定義一個局部特化的單個成員函數('foo '),[這是不允許的](http:// stackoverflow的.com /問題/ 12335762 /部分專業化-的成員函數)。 – Quentin