2010-02-05 9 views
11

mam tej klasy z metody instancji o nazwie otwarty i trzeba wywołać funkcję zadeklarowane w C zwane również otwarty. Następuje próba:Wywołanie w C++ non funkcji członka wewnątrz klasy z metodą z tego samego

void SerialPort::open() 
{ 
    if(_open) 
     return; 
    fd = open (_portName.c_str(), O_RDWR | O_NOCTTY); 
    _open = true; 
} 

Gdy próbuję go skompilować (przy użyciu GCC) pojawia się następujący błąd:

error: no matching function for call to 'SerialPort::open(const char*, int)' 

włączyłem wszystkie wymagane nagłówki C. Kiedy zmieniam nazwę metody na przykład open2 Nie mam problemów z kompilacją.

Jak mogę rozwiązać ten problem. Z góry dzięki.

+2

Na marginesie, należy unikać wpisywania swoich nazw za pomocą "_". – Bill

+0

Nie rozumiem, dlaczego? Jest bardzo przydatny w przypadku zmiennych członkowskich. – jassuncao

+2

Jest to punkt standardu: większość identyfikatorów rozpoczynających się od '_' jest zarezerwowanych. Dokładna lista jest nieco skomplikowana. To coś w rodzaju: w tym 2 kolejne '_', rozpoczynające się od' _', po których następuje wielkie litery, itd ... a ponieważ nie jesteś w stanie zapamiętywać dokładnej listy, najlepiej tego unikać. –

Odpowiedz

33

połączeń

fd = ::open(_portName.c_str(), O_RDWR | O_NOCTTY); 

Podwójny dwukropek (::) przed nazwą funkcji jest C++ 's scope resolution operator:

If the resolution operator is placed in front of the variable name then the global variable is affected.

+0

Dziękuję za szybką odpowiedź – jassuncao

+0

Ale to nie działa, jeśli nie wiesz, która przestrzeń nazw jest otwarta. Na przykład, jeśli polegasz na przestrzeni nazw pierwszego argumentu kompilatora, aby znaleźć właściwy. – PierreBdR

7

Zapis ::open zamiast open. Prefiks :: wskazuje, że nazwa powinna pochodzić z zakresu globalnego. (? Globalna przestrzeń nazw nie jestem pewien o jego dokładnym znaczeniu, aby być uczciwym ...)

3

dodać "::" przed open (_portName.c_str(), O_RDWR | O_NOCTTY);

0

Upewnij:

1) Używasz Rozdzielczość obszaru nazw, jeśli wywoływana funkcja i funkcja są wywoływane, znajdują się w różnych przestrzeniach nazw, w tym nadrzędnej przestrzeni nazw

2) Jeśli twoja funkcja wywołująca jest zdefiniowana powyżej, wywoływana funkcja deklaruje funkcję przed funkcją wywołującą. np .:

Powiązane problemy