我有一個工程,並使用std::enable_if
下面的情況:爲什麼模板參數中的enable_if_t會抱怨重新定義?
template<typename T,
typename std::enable_if<std::is_same<int, T>::value>::type* = nullptr>
void f() { }
template<typename T,
typename std::enable_if<std::is_same<double, T>::value>::type* = nullptr>
void f() { }
現在,我在cppreference看到了新的語法,在我看來更清潔:typename = std::enable_if_t<std::is_same<int, T>::value>>
我想端口我的代碼:
template<typename T,
typename = std::enable_if_t<std::is_same<int, T>::value>>
void g() { }
template<typename T,
typename = std::enable_if_t<std::is_same<double, T>::value>>
void g() { }
但現在GCC(5.2)抱怨:
error: redefinition of 'template<class T, class> void g()'
void g() { }
這是爲什麼呢?在這種情況下,如果可能的話,我能做些什麼來獲得新的,更簡潔的語法?
你的第二個代碼使用默認的模板參數。它們不是函數簽名的一部分,因此您聲明瞭具有相同簽名=重定義的兩個函數模板。相應地使用'enable_if_t'實際上是'std :: enable_if_t :: value> * = nullptr'。 –
dyp
那麼,你沒有完全重寫你的原始代碼。你忘了'* = nullptr'。 –
你可以爲其中一個聲明添加一個虛擬模板參數,比如'enable_if'後面的',typename = void' –