Я верю в простой JS
и с ECMAScript 2015
, что приятно и просто для понимания.
var is_arrays_compare_similar = function (array1, array2) {
let flag = true;
if (array1.length == array2.length) {
// check first array1 object is available in array2 index
array1.every( array_obj => {
if (flag) {
if (!array2.includes(array_obj)) {
flag = false;
}
}
});
// then vice versa check array2 object is available in array1 index
array2.every( array_obj => {
if (flag) {
if (!array1.includes(array_obj)) {
flag = false;
}
}
});
return flag;
} else {
return false;
}
}
надеюсь, что это поможет кому-то.
Это потому, что компилятор будет искать функцию в том же пространстве имен, из которого его аргументы. Компилятор нашел там идентификатор A :: F
, но это не функция. В результате вы получите ошибку.
Насколько я помню, это стандартное поведение.
3.4.2 Поиск имени в зависимости от аргумента Когда неквалифицированное имя используется в качестве постфиксного выражения в вызове функции (5.2.2), другие пространства имен, не учитываемые во время обычного неквалифицированного поиска (3.4.1), могут быть найдены, а объявления дружественных функций области пространства имен (11.4) не в противном случае можно найти видимые. Эти изменения в поиске зависят от типов аргументов (а для аргументов шаблона шаблона - пространства имен аргумента шаблона).
Для каждого типа аргумента T в вызове функции существует набор из нуля или более связанных пространств имен и набор из нуля или более связанных классов, которые необходимо учитывать. Наборы пространств имен и классов полностью определяются типами аргументов функции (и пространством имен любого аргумента шаблона шаблона). Имена Typedef и объявления-использования, используемые для указания типов, не участвуют в этом наборе. Наборы пространств имен и классов определяются следующим образом ...
Это правило позволяет вам написать следующий код:
std::vector<int> x;
// adding some data to x
//...
// now sort it
sort( x.begin(), x.end() ); // no need to write std::sort
И, наконец: из-за Core Issue 218 некоторые компиляторы будут компилировать код, о котором идет речь, без каких-либо ошибок.
Вы уже пробовали использовать другие компиляторы? Здесь есть отчет об ошибке gcc , который приостановлен (что бы это ни значило).
РЕДАКТИРОВАТЬ: После некоторых исследований я обнаружил эту более официальную ошибку .
Очень странно, я скопировал и вставил прямо в VS 2005 и получаю ожидаемую ошибку:
Ошибка 1 ошибка LNK2001: неразрешенный внешний символ "void __cdecl B :: F ( class A :: H) "
Поскольку мы фактически не определили F (x) в пространстве имен B ... не знаю, почему Gcc выдает эту ошибку.
Я просто попытался скомпилировать его в Visual Studio 2005, и он отлично сработал. Интересно, это неработающая реализация поиска, зависящего от аргументов, где пространство имен из аргументов было случайно введено?