C ++ - вызов функции внутри класса с тем же именем, что и класс - PullRequest
15 голосов
/ 30 июня 2009

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

void A(char* D) {
  printf(D);
}

class A 
{
public:
  A(int B);
  void C();
};

A::A(int B) {
  // something here
}

void A::C() {
  A("Hello, World.");
}

Компилятор жалуется со второй до последней строки, что он не может найти функцию A (char *), потому что он находится внутри класса, аКонструктор имеет то же имя, что и функция.Я мог бы написать другую функцию снаружи, например:

ousideA(char* D) {
  A(D);
}

И затем вызвать outsideA внутри A :: C, но это кажется глупым решением проблемы.Кто-нибудь знает более правильный способ решить эту проблему?

Ответы [ 3 ]

40 голосов
/ 30 июня 2009
::A("Hello, world.");

должно работать нормально. В основном это говорит "использовать A, найденное в глобальном пространстве имен"

5 голосов
/ 30 июня 2009

Используйте оператор разрешения области действия :: для доступа к имени из глобальной области действия:

void A::C() {
  ::A("Hello, world.");
}
3 голосов
/ 30 июня 2009

Я предлагаю вам использовать пространства имен. Поместите ваш класс в другое пространство имен, чем функция.

namespace my_namespace1
{

void A() {}

}

namespace my_namespace2
{

struct A {};

}


int main()
{
    my_namespace1::A();
    my_namespace2::A my_a;    
}

Конечно, реальный вопрос в том, почему у вас есть класс и функция с другим именем? Хорошее простое правило - создавать классы с именем WithABeginningCapitalLetter и функции без одного. Тогда у тебя никогда не будет этой проблемы. Конечно, STL этого не делает ...

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