LINUX.ORG.RU

namespaces and function overloading

 , ,


0

2

Господа, подскажите, пункты стандарта которые описывают правила поиска перегрузок в следующей ситуации:

// someone.h
namespace Foo {
void func(int b);
class Test{
  static void test();
}
}

// anotherone.h
namespace Bar {
void func(int b, int a);
}

// someone.cpp
#include "someone.h"
#include "anotherone.h"

using namespace Bar;
using namespace Foo;
namespace Foo {
using Bar::func; // Решение
}
void Test::test()
{
  int a, b;
  func(a, b); // эта функа не находится компилятором...
  Bar::func(a,b);// Так находится
  func(a); // И эта находится
}

Upd: поправил код - не находится функа внутри статического метода класса, как минимум в gcc тоже воспроизводится.

Upd: вспомогательный вопрос:) считается ли перегрузкой функа из неймспейса для функи из другого неймспейса, при условии что оба неймспейса включенны в одну область видимости.

Upd: коллеги помогли найти решение, см сэмпл.

Upd: Печально, что никто так и не дал ссылку на стандарт :)

Upd: спасибо Harald, частично к решению проблеммы можно было прийти прочитав 7.3.3(The using declaration) и 7.3.4(Using directive).

★★★★★

Последнее исправление: pon4ik (всего исправлений: 6)
Ответ на: комментарий от DELIRIUM

А более развернуто?

Мне хотелось бы, обьединить области видимости этих неймспейсов в файле реализации.

pon4ik ★★★★★
() автор топика
Ответ на: комментарий от pon4ik

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

И да,

voi func(int b, int a);
Похоже на опечатку
void func(int b, int a);

peregrine ★★★★★
()
Последнее исправление: peregrine (всего исправлений: 1)
Ответ на: комментарий от peregrine

У меня там никаким ambigous - не пахнет, есть набор перегруженных функций выполняющий конвертацию native->managed. В одном неймспейсе лежат функи для типов общего назначения, а в другом для типов специфичных для даного неймспейса.

pon4ik ★★★★★
() автор топика
Ответ на: комментарий от DELIRIUM

Правда что ли. Так можно было да?

Хочется:

namespace Core{
class CoreEntity;
class CoreEntityRepresentation;
void entityToRepresentation(const CoreEntity& entity, const CoreEntityRepresentation& representation);
}

namespace Feature{
class FeatureEntity;
class FeatureEntityRepresentation;
void entityToRepresentation(const FeatureEntity& entity, const FeatureEntityRepresentation& representation);

struct FeatureImplementationBlaBlaBlaDetails
{
  void  generatedStuff()
  {
     entityToRepresentation(entity1, repr1);
     entityToRepresentation(entity2, repr2);
     entityToRepresentation(entity3, repr3);
  }

private:
CoreEntity entity1;
WtfEntity entity2;
FeatureEntity entity3;
}

}

pon4ik ★★★★★
() автор топика
Ответ на: комментарий от four_str_sam

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

Пожалуй вынесу это в заголовок :)

pon4ik ★★★★★
() автор топика
Ответ на: комментарий от pon4ik
namespace Core{
class CoreEntity;
class CoreEntityRepresentation;
}
void entityToRepresentation(const Core::CoreEntity& entity, const Core::CoreEntityRepresentation& representation);

namespace Feature{
class FeatureEntity;
class FeatureEntityRepresentation;

struct FeatureImplementationBlaBlaBlaDetails
{
  void  generatedStuff()
  {
     entityToRepresentation(entity1, repr1);
     entityToRepresentation(entity2, repr2);
     entityToRepresentation(entity3, repr3);
  }

private:
CoreEntity entity1;
WtfEntity entity2;
FeatureEntity entity3;
}

}

void entityToRepresentation(const Feature::FeatureEntity& entity, const Feature::FeatureEntityRepresentation& representation);
four_str_sam
()
Ответ на: комментарий от peregrine

Да, точно, очепятка, спасибо.

pon4ik ★★★★★
() автор топика
Ответ на: комментарий от pon4ik

Обернуть их в свой неймспейс или засунуть их в какой-нибудь статический класс или вынести наружу одну шаблонную функцию и специализировать с разными параметрами внутрии отдельного спп файла.

four_str_sam
()
Ответ на: комментарий от four_str_sam

Обернуть их в свой неймспейс или засунуть их в какой-нибудь статический класс

Ради того что бы свои функи были в своих неймспейсах, собственно и затевался сабж.

или вынести наружу одну шаблонную функцию и специализировать с разными параметрами внутрии отдельного спп файла

Непонятно чем это лучше просто перегруженных функций, даже хуже, ведь правила перегрузки - проще чем правила шаблонной перегрузки. И непонятно, как в точке вызова показать функи из цпп файла... из хидера можно да, ну или инклуд цэппэшнику сделать.

И уж точно оба решения не проще сделать, т.к. десятка 3-4 функций уже имеются, и в найденном решении что бы их заюзать достаточно 3 строк, а во всех остальных случаях надо всё выкинуть и запилить заного.

pon4ik ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.