Помогает упомянутое ниже решение для ссылок:
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
Как указано в ответе и комментариях Грега, проблема заключается в двух разных типах массивов (поскольку это строковые литералы). Вы можете оставить функцию как есть для универсальных типов, но перегрузить ее для символьных указателей и массивов, это в основном полезно, когда вы хотите обрабатывать их немного иначе.
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) {
// ...
}
Ваш пример компилируется, если вы измените объявление на:
void compare(const T* a, const T* b)
Причина в том, что типы символьных массивов разного размера на самом деле являются разными типами. Если вы использовали sizeof (T)
в функции шаблона, компилятор не знал бы, как разрешить неоднозначность. С помощью приведенного выше объявления вы вызываете функцию-шаблон с типами указателя на T,
Компилятор предпочтет интерпретировать строковые литералы как символьные буферы, если это возможно. Если нет, он может интерпретировать их как const char *. Тем не менее, компилятор не собирается делать никаких обратных действий, чтобы попытаться найти лучшую интерпретацию T. Это не так уж сложно. Как только он решает, что T является const char [3], он переходит к следующему. Тогда оценка второго аргумента не удастся.
Если вы вызовете его с помощью
compare(static_cast<const char *>("aa"),static_cast<const char *>("bbbb"));
- все в порядке.