Пространство имен, сталкивающееся в C++

Я верю в простой 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;
    }

}

надеюсь, что это поможет кому-то.

7
задан George Stocker 17 July 2009 в 12:49
поделиться

4 ответа

Это потому, что компилятор будет искать функцию в том же пространстве имен, из которого его аргументы. Компилятор нашел там идентификатор 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 некоторые компиляторы будут компилировать код, о котором идет речь, без каких-либо ошибок.

11
ответ дан 6 December 2019 в 12:53
поделиться

Вы уже пробовали использовать другие компиляторы? Здесь есть отчет об ошибке gcc , который приостановлен (что бы это ни значило).

РЕДАКТИРОВАТЬ: После некоторых исследований я обнаружил эту более официальную ошибку .

4
ответ дан 6 December 2019 в 12:53
поделиться

Очень странно, я скопировал и вставил прямо в VS 2005 и получаю ожидаемую ошибку:

Ошибка 1 ошибка LNK2001: неразрешенный внешний символ "void __cdecl B :: F ( class A :: H) "

Поскольку мы фактически не определили F (x) в пространстве имен B ... не знаю, почему Gcc выдает эту ошибку.

1
ответ дан 6 December 2019 в 12:53
поделиться

Я просто попытался скомпилировать его в Visual Studio 2005, и он отлично сработал. Интересно, это неработающая реализация поиска, зависящего от аргументов, где пространство имен из аргументов было случайно введено?

0
ответ дан 6 December 2019 в 12:53
поделиться
Другие вопросы по тегам:

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