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)編譯此代碼。
在這種情況下,如果您聲明一個函數以兩個foo作爲const ref參數,您不需要指定第二個typename? –
@PierreAntoineGuillaume如'void baz(foo const&)'?這是因爲它只是使用(實例化)'foo'。另一方面,定義'foo'需要你清楚你所關注的是哪部分'foo'。你的語法*可能意味着「使用默認參數」,但在你的情況下,你會定義一個局部特化的單個成員函數('foo '),[這是不允許的](http:// stackoverflow的.com /問題/ 12335762 /部分專業化-的成員函數)。 –
Quentin