Безымянное пространство имен - PullRequest
5 голосов
/ 26 июня 2011

есть следующий код:

#include <iostream>

using namespace std;

namespace
{
    int funkcja()
    {
        cout << "unnamed" << endl;
        return 0;
    }
}

int funkcja()
{
    cout << "global" << endl;
    return 0;
}

int main()
{
    ::funkcja(); //this works, it will call funkcja() from global scope
    funkcja(); //this generates an error 
    return 0;    
}

Я использую g ++. Есть ли способ вызова функции из безымянного пространства имен в такой ситуации? Можно вызвать функцию из глобальной области видимости, используя :: function, но как вызвать функцию из безымянного пространства имен? Компилятор генерирует ошибку:

prog3.cpp: In function ‘int main()’:
prog3.cpp:43:17: error: call of overloaded ‘funkcja()’ is ambiguous
prog3.cpp:32:5: note: candidates are: int funkcja()
prog3.cpp:25:6: note:                 int<unnamed>::funkcja()

Ответы [ 2 ]

4 голосов
/ 26 июня 2011

Способ работы анонимных пространств имен заключается в том, что имена, объявленные внутри них, автоматически видны во вложенной области видимости, как если бы был выдан using namespace name_of_anonymous_namespace;.

Из-за этого в вашем примере имя funkcja является неоднозначным и недвусмысленным [новое слово!].Похоже, вам не нужно анонимное пространство имен, вам действительно нужно правильно именованное пространство имен.

2 голосов
/ 26 июня 2011

Есть ли способ вызвать функцию из безымянного пространства имен в такой ситуации?
Нет, не в вашем случае.

Пространства имен Anonymous / UnNamed позволяют переменным и функциям быть видимыми во всей единице перевода , но внешне не видны.Хотя сущности в безымянном пространстве имен могут иметь внешнюю связь, они фактически квалифицируются по имени, уникальному для их единицы перевода, и поэтому никогда не могут быть видны из любой другой единицы перевода.

Это означает, что ваша функция funkcja внутри Безымянного пространства имен видна в блоке перевода, который определяет глобальную функцию funkcja.Это вызывает две одинаковые именованные функции, определенные в глобальной области видимости и, таким образом, вызывает ошибку переопределения.

Если бы funkcja присутствовал только в вашем Пространстве имен без имен, вы бы смогли вызвать его по ::funkcja, как это было бы в вашей глобальной области видимости.В заключение можно вызвать функции в пространстве имен UnNamed в зависимости от области, в которой присутствует пространство имен UnNamed.

...