Возможный дубликат:
std :: enable_if для условной компиляции функции-члена
Я пытаюсь перегрузить метод Foo<T>::bar()
для конкретных типов T
следующим образом — безуспешно. Я был бы признателен за указатели и обходные пути.
#include <cstdlib>
#include <iostream>
#include <boost/type_traits.hpp>
#include <boost/utility/enable_if.hpp>
template<typename T>
struct Foo
{
typename boost::enable_if_c<boost::is_same<char,T>::value >::type
bar();
typename boost::disable_if_c<boost::is_same<char,T>::value >::type
bar();
};
template<typename T>
typename boost::disable_if_c<boost::is_same<char,T>::value >::type
Foo<T>::bar()
{
std::cout << "I am generic ..." << std::endl;
}
template<typename T>
typename boost::enable_if_c<boost::is_same<char,T>::value >::type
Foo<T>::bar()
{
std::cout << "I am specific ..." << std::endl;
}
int main()
{
Foo<char> f;
f.bar();
return EXIT_SUCCESS;
}
Компилируя это на ideone выдает следующие ошибки компилятора:
prog.cpp:13: error: ‘typename boost::disable_if_c<boost::is_same::value, void>::type Foo<T>::bar()’ cannot be overloaded
prog.cpp:10: error: with ‘typename boost::enable_if_c<boost::is_same::value, void>::type Foo<T>::bar()’
prog.cpp:18: error: prototype for ‘typename boost::disable_if_c<boost::is_same::value, void>::type Foo<T>::bar()’ does not match any in class ‘Foo<T>’
prog.cpp:10: error: candidate is: typename boost::enable_if_c<boost::is_same::value, void>::type Foo<T>::bar()
Вы используете enable_if и disable_if с одинаковыми параметрами. Похоже, вы включаете и отключаете один и тот же экземпляр шаблона, и компилятор считает, что вы его перегружаете. Не используйте is_same_char в обоих случаях.
Других решений пока нет …