eval()
не является необходимым. Это будет работать нормально:
var date = new Date(parseInt(jsonDate.substr(6)));
Функция substr()
забирает часть /Date(
, а функция parseInt()
получает целое число и игнорирует )/
в конце. Полученное число передается в конструктор Date
.
Я намеренно пропустил основание (2-й аргумент parseInt
); см. мой комментарий ниже .
Кроме того, я полностью согласен с комментарием Рори : даты ISO-8601 предпочтительнее этого старого формата - поэтому этот формат обычно не следует использовать для новой разработки. См. Превосходную библиотеку Json.NET для отличной альтернативы, которая сериализует даты, используя формат ISO-8601.
Для дат JSON в формате ISO-8601 просто передайте строку в конструктор Date
:
var date = new Date(jsonDate); //no ugly parsing needed; full timezone support
Суть вашего вопроса в том, что у вас есть:
template <typename X, typename Y, typename Z>
struct Foo {};
template <typename X>
struct Foo<X, Base<X>, void> {}; // #1
template <typename X, typename Y>
struct Foo<X, Y, typename whatever<Y>::type> {}; // #2
и вы пытаетесь сопоставить его с
Foo<int, Base<int>, void>
Очевидно, совпадают обе специализации (первая с X = int
, второй с X = int, Y = Base
).
Согласно стандарту, раздел 14.5.4, если есть больше подходящих специализаций, частичный порядок (как определено в 14.5.5.2), из них создается и используется наиболее специализированный. Однако в вашем случае ни один из них не является более специализированным, чем другой. (Проще говоря, шаблон более специализирован, чем другой, если вы можете заменить каждый параметр типа последнего шаблона каким-либо типом и в результате получить подпись первого. Кроме того, если у вас есть something
и замените Y
на Base
Думаю, вам не хватает символа '<', шаблон должен выглядеть так:
template< typename T >
struct myStruct
{};
//OR
template< class T >
struct myStruct
{};