Почему я должен использовать имя типа определения типа в g ++, но не VS?

Я не думаю, что Умбрако сработает, если вы попытаетесь это сделать. Когда вы запускаете Umbraco в качестве мультитенантной установки, он обычно использует одну и ту же БД для всех сайтов, которые вы запускаете при установке.

Проблема, с которой вы столкнетесь, заключается в том, что Umbraco будет генерировать свои файлы кэша и т. Д., Которые питают сайт от БД, поэтому каждый раз, когда вы переключаете БД, эти файлы кэша будут регенерироваться на основе НОВОЙ базы данных, поэтому ВСЕ посты будут отображаться содержимое последней использованной базы данных.

Если вам нужны специфичные для клиента данные, у вас всегда может быть база данных SEPARATE для каждого клиента, в которой хранятся специфичные для этого клиента данные в дополнение к основной базовой базе данных, которую использует Umbraco.

50
задан Gorgor 8 December 2016 в 04:03
поделиться

4 ответа

Имя типа требуется стандартом. Шаблонная компиляция требует двух проверок шага. Во время первой передачи компилятор должен проверить шаблонный синтаксис, на самом деле не предоставляя замены типа. На этом шаге, станд.:: карта:: итератор, как предполагается, является значением. Если это действительно обозначает тип, ключевое слово имени типа требуется.

, Почему это необходимо? Прежде substituing фактический КЛЮЧ и типы ЗНАЧЕНИЯ, компилятор не может гарантировать, что шаблон не специализирован и что специализация не переопределяет итератор ключевое слово как что-то еще.

можно проверить его с этим кодом:

class X {};
template <typename T>
struct Test
{
   typedef T value;
};
template <>
struct Test<X>
{
   static int value;
};
int Test<X>::value = 0;
template <typename T>
void f( T const & )
{
   Test<T>::value; // during first pass, Test<T>::value is interpreted as a value
}
int main()
{
  f( 5 );  // compilation error
  X x; f( x ); // compiles fine f: Test<T>::value is an integer
}

последняя возможность перестала работать с ошибкой при указании что во время первого шаблонного шага компиляции f () Тест:: значение интерпретировалось как значение, но инстанцирование Test<> шаблон с типом X приводит к типу.

56
ответ дан David Rodríguez - dribeas 7 November 2019 в 10:53
поделиться

Ну, GCC не делает на самом деле , требуют typedef - typename, достаточно. Это работает:

#include <iostream>
#include <map>

template<typename KEY, typename VALUE>
bool find(const std::map<KEY,VALUE>& container, const KEY& key)
{
    typename std::map<KEY,VALUE>::const_iterator iter = container.find(key);
    return iter!=container.end();
}

int main() {
    std::map<int, int> m;
    m[5] = 10;
    std::cout << find(m, 5) << std::endl;
    std::cout << find(m, 6) << std::endl;
    return 0;
}

Это - пример контекстно-зависимой проблемы парсинга. Что строка рассматриваемое средство не очевидно из синтаксиса в этой функции только - необходимо знать, является ли std::map<KEY,VALUE>::const_iterator типом или нет.

Теперь, я, может казаться, не думаю о примере какой... ::const_iterator мог бы быть кроме типа, который также не будет ошибкой. Таким образом, я предполагаю, что компилятор может узнать, что имеет , чтобы быть типом, но это могло бы быть трудно для плохого компилятора (писатели).

стандарт требует использования typename здесь, согласно litb разделом 14.6/3 стандарта.

32
ответ дан Magnus Hoff 7 November 2019 в 10:53
поделиться

Похоже, что VS/ICC предоставляет typename ключевое слово везде, где это думает , это требуется. Обратите внимание, что это - Bad Thing (TM) - чтобы позволить компилятору решить то, что Вы хотите. Это далее усложняет выпуск прививанием дурная привычка к пропуску typename при необходимости и является кошмаром мобильности. Это - определенно не стандартное поведение. Попробуйте в строгом стандартном режиме или Comeau.

4
ответ дан dirkgently 7 November 2019 в 10:53
поделиться

Это - ошибка в Microsoft C ++ компилятор - в Вашем примере, станд.:: карта:: итератор не мог бы быть типом (Вы, возможно, специализировали станд.:: карта на КЛЮЧЕ, ОЦЕНИТЕ так, чтобы станд.:: карта:: итератор был переменной, например).

GCC вынуждает Вас написать правильный код (даже при том, что то, что Вы имели в виду, было очевидно), тогда как компилятор Microsoft правильно предполагает то, что Вы имели в виду (даже при том, что код, который Вы написали, был неправильным).

3
ответ дан JoeG 7 November 2019 в 10:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: