Определение пользовательского оператора равенства в анонимном пространстве имен

По крайней мере, вплоть до CSS3, включая CSS3, вы не можете выбрать это. Но это может быть сделано довольно легко в настоящее время в JS, вам просто нужно добавить немного ванильного JavaScript, обратите внимание, что код довольно короткий.

      cells = document.querySelectorAll('div');
              [].forEach.call(cells, function (el) {
              //console.log(el.nodeName)
                if (el.hasChildNodes() && el.firstChild.nodeName=="A") {
                console.log(el)};
            });
            <div>Peter</div>
            <div><a href="#">Jackson link</a></div>
            <div>Philip</div>
            <div><a href="#">Pullman link</a></div>

4
задан Mark Pauley 28 March 2019 в 04:38
поделиться

2 ответа

Первое, на что нужно обратить внимание, это то, что аноним namespace не совпадает с namespace.

namespace
{
    bool operator==(const Foo&, const Foo&) {...}
}

- это действительно что-то вроде

namespace ANameUniqueToTheFile
{
    bool operator==(const Foo&, const Foo&) {...}
}

using ANameUniqueToTheFile;

с тем недостатком, что язык не дает вам возможности получить имя namespace.

По этой причине, функция operator==, определенная в анонимном namespace, не найдена с использованием ADL.


Я понимаю, почему вы хотите поместить функцию operator== в namespace. Один из возможных способов сделать это - файл #include .h, который определяет struct внутри именованного namespace.

FooWrapper.h:

namespace MyApp
{
   #include "foo.h"

   // Declare the function.
   bool operator==(Foo const& lhs, Foo const& rhs);
}

FooWrapper.cpp

#include "FooWrapper.h"

namespace MyApp
{
   // Implement the function.
   bool operator==(Foo const& lhs, Foo const& rhs) { ... }
}

Однако ...

Я понимаю, что немного упрощаю то, что в "foo.h". Добавление всех из них в namesapce MyApp может быть неуместным, особенно если «foo.h» включает в себя другие файлы .h и / или стандартные заголовочные файлы. Я надеюсь, что это даст вам некоторые идеи о том, как решить проблему.

Если поместить все «foo.h» в namespace MyApp не гладко, вероятно, будет целесообразно определить функцию operato== в глобальной области видимости.

0
ответ дан R Sahu 28 March 2019 в 04:38
поделиться

Я думаю, вы обнаружите, что std::vector на самом деле действительно находит оператор в анонимном пространстве имен, если объявление этого оператора происходит до #include <vector>.

Причина, по которой он не находит его в вашем коде, связана с двухфазным поиском имен в функциях шаблона. Первый этап находит кандидатов во всех пространствах имен в области видимости. Второй этап находит только зависимые имена. «Поиск, зависящий от аргумента», который ищет пространство имен, содержащее тип, зависит от фразы. Поиск в анонимном пространстве имен не зависит, поэтому он не будет выполнен на втором этапе.

См. Также:

0
ответ дан Ben Voigt 28 March 2019 в 04:38
поделиться
Другие вопросы по тегам:

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