Шаблонная ошибка инстанцирования

Помогает упомянутое ниже решение для ссылок:

https://github.com/evrone/quiet_assets

Кроме того, как показано ниже, оно отлично работает для меня

3,1 (только) (3,2 перерыва перед отправкой)

app\config\initializers\quiet_assets.rb

Rails.application.assets.logger = Logger.new('/dev/null')
Rails::Rack::Logger.class_eval do
  def before_dispatch_with_quiet_assets(env)
    before_dispatch_without_quiet_assets(env) unless env['PATH_INFO'].index("/assets/") == 0
  end
  alias_method_chain :before_dispatch, :quiet_assets
end
3.2 Rails - Rack root tap approach
app\config\initializers\quiet_assets.rb

Rails.application.assets.logger = Logger.new('/dev/null') 
Rails::Rack::Logger.class_eval do 
  def call_with_quiet_assets(env)
    previous_level = Rails.logger.level
    Rails.logger.level = Logger::ERROR if env['PATH_INFO'].index("/assets/") == 0 
    call_without_quiet_assets(env).tap do
      Rails.logger.level = previous_level
    end 
  end 
  alias_method_chain :call, :quiet_assets 
end 

5
задан chappar 27 June 2009 в 04:21
поделиться

3 ответа

Как указано в ответе и комментариях Грега, проблема заключается в двух разных типах массивов (поскольку это строковые литералы). Вы можете оставить функцию как есть для универсальных типов, но перегрузить ее для символьных указателей и массивов, это в основном полезно, когда вы хотите обрабатывать их немного иначе.

void compare(char const* a, char const* b) {
    // do something, possibly use strlen()
}

template<int N1, int N2>
void compare(char const (&a)[N1], char const (&b)[N2]) {
    // ...
}

Если вы хотите указать, что сравнение должно принимать символьные указатели явно, тогда массивы будут автоматически преобразованы:

compare<char const*>("aa", "bbbb");

С другой стороны, может быть, можно было бы написать compare для работы с двумя разными типами? Это может быть полезно и для других типов, например, может быть, он вызывает f (a) if a.size () и f (b ) в противном случае (с перегрузкой f ). (Т1 и Т2 могут быть одного и того же типа ниже, и это заменит вашу функцию, а не перегрузит ее, как два вышеупомянутых.)

template<typename T1, typename T2>
void compare(T1 const& a, T2 const& b) {
    // ...
}
4
ответ дан 18 December 2019 в 14:50
поделиться

Ваш пример компилируется, если вы измените объявление на:

void compare(const T* a, const T* b)

Причина в том, что типы символьных массивов разного размера на самом деле являются разными типами. Если вы использовали sizeof (T) в функции шаблона, компилятор не знал бы, как разрешить неоднозначность. С помощью приведенного выше объявления вы вызываете функцию-шаблон с типами указателя на T,

6
ответ дан 18 December 2019 в 14:50
поделиться

Компилятор предпочтет интерпретировать строковые литералы как символьные буферы, если это возможно. Если нет, он может интерпретировать их как const char *. Тем не менее, компилятор не собирается делать никаких обратных действий, чтобы попытаться найти лучшую интерпретацию T. Это не так уж сложно. Как только он решает, что T является const char [3], он переходит к следующему. Тогда оценка второго аргумента не удастся.

Если вы вызовете его с помощью

compare(static_cast<const char *>("aa"),static_cast<const char *>("bbbb"));

- все в порядке.

3
ответ дан 18 December 2019 в 14:50
поделиться
Другие вопросы по тегам:

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