Взаимодействие шаблона / пространства имен - PullRequest
0 голосов
/ 12 февраля 2010

я наткнулся на компиляцию .. странность? недавно это привело меня к мысли, что шаблон при его создании создается в тех же пространствах имен (или, по крайней мере, using в тех же пространствах имен), что и тот, который был объявлен. То есть;

template<class T>
class bar
{
public:
    static int stuff(){return T::stuff();}
};

namespace ONE
{
    struct foo
    {
        static int stuff(){return 1;}
    };
}

namespace TWO
{
    struct foo
    {
        static int stuff(){return 2;}
    };
}


using namespace TWO;

int main() 
{

    return bar<foo>::stuff();
}

вернет 1 при using namespace ONE и 2 при using namespace TWO.

Почему? И есть ли другие "странные" или "неожиданные" взаимодействия между пространствами имен и шаблонами?

Редактировать: В то время это приводило в замешательство, поскольку одни и те же шаблоны использовались в нескольких файлах, каждый using имел различное пространство имен.

Ответы [ 2 ]

6 голосов
/ 12 февраля 2010

Я не уверен, что здесь удивительного. Когда вы говорите using namespace ONE, вы переводите ONE :: foo в область действия, которая теперь распознается как foo. В приведенном выше коде шаблон получает TWO :: foo в качестве параметра. Он не имеет ничего общего с шаблоном, все, что происходит в main (), когда вы вызываете bar<T>::stuff().

6 голосов
/ 12 февраля 2010

Это не неожиданно. Вы не указали, какой foo вы хотели, поэтому ваше объявление using сообщило компилятору, где его найти.

Наихудший шаблон, который я видел в производственном коде, был связан с поиском независимого имени. Это довольно сложно, поэтому, вероятно, лучше просто указать на C ++ FAQ Lite (разделы 35.18-20).

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