Я пытаюсь перенести код C ++ из Windows в Solaris (Unix).Есть некоторые шаблоны кода, которые необходимо изменить.Я использую компилятор CC Solaris, у g ++ должна быть та же проблема.
У меня есть определенная часть кода, создающая некоторые проблемы.Они упрощены следующим образом:
#include <exception>
#include <cmath>
#include <string>
#include <iostream>
// define the "not implement" error
class tempException: public std::exception
{
public:
virtual const char* what() const throw()
{
return "not been implemented!";
}
} nondeferr;
// the template class
template <typename T>
class A
{
public:
template <typename Val>
Val getValue(T t) { throw nondeferr; }
template<>
double getValue(T t) { return exp( 1.5 * t ); } //Specialize the getValue for double type.
};
// test code
int main()
{
try
{
A<int> testA;
std::cout << testA.getValue<double>(2) << std::endl;
std::cout << testA.getValue<std::string>(2) << std::endl;
}
catch (tempException& e)
{
std::cout << e.what() << std::endl;
}
return 0;
}
Чтобы скомпилировать этот пример кода в UNIX, возникает ошибка компиляции, поскольку явная специализация не может быть в области действия класса A.
Здесь функция getValueтолько отличается от возвращаемого типа, поэтому мы не можем изменить его, используя способ перегрузки.
И по какой-то причине изменить класс A с простой переменной шаблона T на класс A с двойными переменными шаблона T и Val не допускается.Когда мы попытаемся использовать этот базовый класс, он внесет множество изменений.
Могу ли я узнать, есть ли какое-нибудь решение?В настоящее время я удаляю функцию getValue, заменяю ее как getDoubleValue ... Но это тоже не так хорошо.
Для тех, кому интересно, теперь класс A выглядит следующим образом:
template <typename T>
class A
{
public:
// the Get Value we want
template <typename R>
R getValue(T t) { return get_value_impl<R>::apply(*this, t); }
// the general get value struct
template<typename R, typename = void>
struct get_value_impl
{
static R apply(A a, T t) { throw nondeferr; }
};
// partial specialization, which is allowed in std C++
template <typename S>
struct get_value_impl<double, S>
{
static double apply(A a, T t) { return exp( 1.5 * t ); }
};
};
Логика явной специализации не допускается в стандарте.Тем не менее, частичная специализация допускается.Еще раз спасибо Anycorn за великолепное решение.