Dlaczego jest tak, że to kompiluje:Dlaczego nie mogę szablonować przeciążenia?
class Testable {
public:
template <bool flag>
typename std::enable_if<flag>::type
void foo() { cout << "Yay" << endl; }
template <bool flag>
typename std::enable_if<!flag>::type
void foo() { cout << "Nay" << endl; }
};
Ale jeśli nie mogę zdefiniować zarówno Foos Używanie typów domyślnych tak:
template <bool flag, typename = typename std::enable_if<flag>::type>
void foo() { cout << "Yay" << endl; } // (A)
template <bool flag, typename = typename std::enable_if<!flag>::type>
void foo() { cout << "Nay" << endl; } // (B)
otrzymuję ten błąd (pierwsza linia wskazuje definicji (B)
, drugi wskazując (A)
):
error: 'template<bool flag, class> void Testable::foo()' cannot be overloaded
error: with 'template<bool flag, class>> void Testable::foo()'
To właściwie nadal mnie nie kompiluje (na gcc4.6.3). Otrzymuję 'no matching function dla wywołania 'Testable :: foo()'', gdy próbuję po prostu wywołać foo(). –
Barry
@Barry Musisz użyć argumentu szablonu 'foo'. Nie ma niczego, co mogłoby to wydedukować. Czy wypróbowałeś 'obj.foo();'? –
WhozCraig
@WhozCraig - Tak, cała moja główna jest po prostu 'Testowalna t; t.foo(); ' –
Barry