namespace + определение ф-й
От: Patalog Россия  
Дата: 28.04.10 07:31
Оценка:
Всем привет!

Кто может сказать, насколько легально данное определение ф-й? Желательно со сылками на стандарт?
Нутром чую что не правильно, а доказать не могу. =)

//header (.h) file
namespace X
{
    struct A
    {
        void func();
    };
}

//source (.cpp) file
using namespace X;
void A::func()
{}
Почетный кавалер ордена Совка.
Re: namespace + определение ф-й
От: _nn_ www.nemerleweb.com
Дата: 28.04.10 08:01
Оценка: 4 (1)
Здравствуйте, Patalog, Вы писали:

P>Всем привет!


P>Кто может сказать, насколько легально данное определение ф-й? Желательно со сылками на стандарт?

P>Нутром чую что не правильно, а доказать не могу. =)

P>
P>//header (.h) file
P>namespace X
P>{
P>    struct A
P>    {
P>        void func();
P>    };
P>}
P>

P>
P>//source (.cpp) file
P>using namespace X;
P>void A::func()
P>{}
P>


Как раз код правильный. (Ну там #include нужен )
using namespace вытаскивает все из пространства имен и добавляет в глобальное.
Таким образом void A::func вполне валидное определение функции.

P.S.
Я бы оставил функцию внутри пространства имен не раскрывая.
Меньше проблем будет
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: namespace + определение ф-й
От: uzhas Ниоткуда  
Дата: 28.04.10 08:04
Оценка:
Здравствуйте, Patalog, Вы писали...

Нутром чую, что стандарт позволяет так определять функции, а доказать не могу. =)
Re: namespace + определение ф-й
От: Bell Россия  
Дата: 28.04.10 08:35
Оценка: 11 (2) :)
Здравствуйте, Patalog, Вы писали:

P>Всем привет!


P>Кто может сказать, насколько легально данное определение ф-й? Желательно со сылками на стандарт?

P>Нутром чую что не правильно, а доказать не могу. =)

Комо компилит, а это говорит о многом

А насчет стандарта...
3.4.3/6
...
However, in such namespace member declarations, the nested-name-specifier may rely on
using-directives to implicitly provide the initial part of the nested-name-specifier.

[Example:
namespace A {
   namespace B {
      void f1(int);
   }
}
namespace C {
   namespace D {
      void f1(int);
   }
}
using namespace A;
using namespace C::D;
void B::f1(int){} // OK, defines A::B::f1(int)
—end example]
Любите книгу — источник знаний (с) М.Горький
Re[2]: namespace + определение ф-й
От: _nn_ www.nemerleweb.com
Дата: 28.04.10 08:52
Оценка: :))
Здравствуйте, Bell, Вы писали:

B>Комо компилит, а это говорит о многом

Так и хочется чтобы при создании поста в форуме С++ был хинт скомпилировать в Комо
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: namespace + определение ф-й
От: Patalog Россия  
Дата: 28.04.10 08:53
Оценка:
Здравствуйте, Bell, Вы писали:

[]

B>А насчет стандарта...

B>3.4.3/6
B>...
B>However, in such namespace member declarations, the nested-name-specifier may rely on
B>using-directives to implicitly provide the initial part of the nested-name-specifier.

B>
B>[Example:
B>namespace A {
B>   namespace B {
B>      void f1(int);
B>   }
B>}
B>namespace C {
B>   namespace D {
B>      void f1(int);
B>   }
B>}
B>using namespace A;
B>using namespace C::D;
B>void B::f1(int){} // OK, defines A::B::f1(int)
B>—end example]
B>


А так?
//header (.h) file
namespace X
{
   void f();
}

//source (.cpp) file
using namespace X;
void f()
{}

vc 2008 не линкует...
Почетный кавалер ордена Совка.
Re[3]: namespace + определение ф-й
От: Bell Россия  
Дата: 28.04.10 09:20
Оценка: 5 (2)
Здравствуйте, Patalog, Вы писали:

P>А так?

P>
P>//header (.h) file
P>namespace X
P>{
P>   void f();
P>}

P>//source (.cpp) file
P>using namespace X;
P>void f()
P>{}
P>

P>vc 2008 не линкует...

f — не квалифицированное имя, и не подпадает под 3.4.3. Т.е. в данном случае определение функции f принадлежит глобальному пространству имен.
Любите книгу — источник знаний (с) М.Горький
Re[3]: namespace + определение ф-й
От: saf_e  
Дата: 29.04.10 16:17
Оценка:
Здравствуйте, Patalog, Вы писали:


P>А так?

P>
P>//header (.h) file
P>namespace X
P>{
P>   void f();
P>}

P>//source (.cpp) file
P>using namespace X;
P>void f()
P>{}
P>

P>vc 2008 не линкует...


Да, в свое время я побегал по этим граблям
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.