Войти
ФлеймФорумПрограммирование

[C++] Эту функцию нельзя вызвать?[решено]

Страницы: 1 2 3 Следующая »
#0
20:11, 8 фев. 2015
#include <iostream>

struct B{};
struct A{friend B*foo(B*ptr){std::cout<<"impossible";return ptr;}};

int main(){
  B*ptr;
  foo(ptr); // fail
  A::foo(ptr); // fail
  return 0;
}
compilation info
prog.cpp: In function 'int main()':
prog.cpp:8:10: error: 'foo' was not declared in this scope
   foo(ptr);
          ^
prog.cpp:9:3: error: 'foo' is not a member of 'A'
   A::foo(ptr);
   ^
http://ideone.com/WHGpMZ

Сабж.


#1
20:14, 8 фев. 2015

http://ideone.com/7iI3qE
?

#2
20:27, 8 фев. 2015

Hardcode
>http://ideone.com/7iI3qE
Зачёт!

Вообще тут явно какая-то недоработка и костыльность.

#include <iostream>

struct A{friend A*foo(A*ptr){std::cout<<"possible";return ptr;}};

int main(){
  A*ptr;
  foo(ptr); // ok
  return 0;
}
Но:
#include <iostream>

struct A{friend A*foo(A*ptr){std::cout<<"possible";return ptr;}};

int main(){
  foo((void*)0); //fail
  return 0;
}
Похоже friend идут как explicit если реализованы прямо при объявлении.

#3
20:45, 8 фев. 2015

Adler
Френды идут как статические функции класса

#4
20:47, 8 фев. 2015

Adler
> Вообще тут явно какая-то недоработка и костыльность.
В первом случае сработал похоже Argument-dependent name lookup

#5
20:49, 8 фев. 2015
6 A function can be defined in a friend declaration of a class if and only if the class is a non-local class (9.8),
the function name is unqualified, and the function has namespace scope. [ Example:
class M {
friend void f() { } // definition of global f, a friend of M,
// not the definition of a member function
};
—end example ]
7 Such a function is implicitly inline. A friend function defined in a class is in the (lexical) scope of the
class in which it is defined. A friend function defined outside the class is not (3.4.1).

Кусок из стандарта, но я хз, как его применить в нашем случае
#6
20:49, 8 фев. 2015

laMer007
> Френды идут как статические функции класса

не правда.

A::foo(ptr); //  error: ‘foo’ is not a member of ‘A’


Adler
> Похоже friend идут как explicit если реализованы прямо при объявлении.

хз. Поведение одинаковое cl/gcc/clang

#7
20:52, 8 фев. 2015

Hardcode
> В первом случае сработал похоже Argument-dependent name lookup

дык, не понятно, почему во втором случае вообще ничего не сработало.

#8
21:08, 8 фев. 2015

Kartonagnick
> не правда.
Я имел ввиду без this. А так они в скопе вне класса объявлены

#9
21:14, 8 фев. 2015

Короче, суть похоже такова:
Unqualified name lookup не ищет имя в классах поэтому foo(ptr) из 1 поста не может найти имя. (Argument-dependent name lookup есть, но применяется к B а не к A)
Вызов через два двоеточия невозможен, потому что foo не является статической функцией или методом класса.
Код из второго поста скомпилировался, потому что сработал Argument-dependent name lookup для A. И это, похоже, единственный способ достать foo.

#10
21:15, 8 фев. 2015

laMer007
> А так они в скопе вне класса объявлены

Ну я вот всегда думал, что они объявлены в том же пространстве, в котором объявлен класс.

Но тогда не понятно, что за канитель #2

#11
21:17, 8 фев. 2015

Крестопроблемы, короче.

#12
21:23, 8 фев. 2015

Hardcode
> Короче, суть похоже такова:

Чета как то после такой сути вапросикаф меньше не становиццо...

#13
21:37, 8 фев. 2015

Kartonagnick
> хз. Поведение одинаковое cl/gcc/clang
у меня cl от Microsoft Visual Studio 2010 скомпилил вот это на ура:

#include <iostream>

struct B{};
struct A{friend B*foo(B*ptr){std::cout<<"impossible";return ptr;}};

int main(){
  B*ptr;
  foo(ptr);  //ok
  return 0;
}

Похоже просто в gcc баг.

#14
21:40, 8 фев. 2015

Adler
> Похоже просто в gcc баг.
http://rextester.com/AOTAE69601

Страницы: 1 2 3 Следующая »
ФлеймФорумПрограммирование

Тема в архиве.