Код шаблона не скомпилируется (отложенный поиск) - PullRequest
4 голосов
/ 21 ноября 2011

У меня есть два странных случая, когда кажется, что код должен компилироваться, но это не так. Для начала рассмотрим приведенный ниже код, который успешно компилируется:

struct A
{
    template <class T>
    void member_func(T t)
    {
        global_func(t);
    }
};

int main()
{
}

Но если я полностью укажу global_func, добавив префикс «::», он не скомпилируется с ошибкой «global_func не был объявлен в этой области»:

struct A
{
    template <class T>
    void member_func(T t)
    {
        ::global_func(t);
    }
};

int main()
{
}

Кроме того, если я попытаюсь передать global_func для boost :: bind, он не скомпилируется (та же ошибка):

#include <boost/bind.hpp>

class A
{
    template <class T>
    void member_func(T t)
    {
        boost::bind(global_func)(t);
    }
};

int main()
{
}

Почему он не компилируется в этих случаях? Кажется, что метод шаблона member_func () не создан, поэтому он не должен найти ошибку отсутствующей функции.

1 Ответ

10 голосов
/ 21 ноября 2011

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

Во втором примере ::global_func является квалифицированным именем, поэтому его поиск не являетсяdeferred, и его нужно посмотреть на указатель, в котором определен шаблон.

Аналогично, в выражении boost::bind(global_func), global_func не используется в выражении, которое зависит от параметра шаблона, поэтому, опять же,поиск не откладывается, и объявление должно быть видимым в точке определения шаблона элемента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...