У меня есть шаблон шаблона name
для обнаружения имен типов. Он работает для простых типов, таких как int
, float
. Однако для некоторого типа шаблона, такого как std:pair
, компилятор (VS2013) сообщает об ошибке в строке, когда я пытаюсь определить ее статическую переменную-член.класс шаблон специализация с шаблоном
#include <cassert>
#include <memory>
using namespace std;
template<class T> struct name{ static const char* value; };
template<class T> const char* name<T>::value = "unknown";
template<> const char* name<int>::value = "int";
template<> const char* name<float>::value = "float";
template<class T1, class T2> const char* name<pair<T1, T2> >::value = "pair"; //compilation error
void main()
{
assert(name<int>::value == "int");
assert(name<float>::value == "float");
assert(name<double>::value == "unknown");
assert((name<pair<int, char> >::value) == "pair");
}
Если я заменю эту строку следующими четырьмя строками, программа работает должным образом.
template<class T1, class T2> struct name < pair<T1, T2> > {
static const char* value;
};
template<class T1, class T2> const char* name<pair<T1, T2> >::value = "pair";
Но этот способ выглядит уродливым из-за дублирования кода. Есть ли способ ходить?
Обновлено, чтобы устранить некоторые очевидные стандартные проблемы.
это трудно даже начать перечислять все вещи, которые не так с этим кодом, а сосредоточиться на вопросе под рукой: вы можете только специализироваться статические элементы данных в явном виде, но не частично. –
Мне жаль, что вы используете такой ужасный компилятор, что вы как-то ушли, думая, что ваш код удаленно исправлен. Почти каждая строка имеет серьезную ошибку, и я обвиняю компилятор в том, что вы обманываете вас, думая, что все в порядке. –
Вы должны сделать тип 'static const char * const value' –