Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> вызов free-функции из метода с таким же именем 
V
    Опции темы
boostcoder
Дата 8.8.2011, 00:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110




есть шаблон:
Код

template<bool, bool, typename T>
struct type {
   template<typename T>
   static void apply(A& a, const T& v) {
      apply(a, v); // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
   }
};

в таком виде вхожу в рекурсию.
как разрулить?


спасибо.

PM WWW   Вверх
mes
Дата 8.8.2011, 00:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



указание полной квалификации имени не подходит ? 
для глобального пространства  ::apply 


Это сообщение отредактировал(а) mes - 8.8.2011, 00:40


--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 8.8.2011, 00:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



mes, это что/как?
PM WWW   Вверх
volatile
Дата 8.8.2011, 00:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Может так?
::apply(a, v); 

упс...
опередили...

Это сообщение отредактировал(а) volatile - 8.8.2011, 00:42
PM MAIL   Вверх
boostcoder
Дата 8.8.2011, 00:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(mes @  8.8.2011,  00:39 Найти цитируемый пост)
для глобального пространства  ::apply

говорит что нет такой функции.

Добавлено через 1 минуту и 37 секунд
кстати, шаблон в пространстве имен. а функция нет. хотя по идее может... зависит от юзера.
PM WWW   Вверх
volatile
Дата 8.8.2011, 00:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(boostcoder @  8.8.2011,  00:43 Найти цитируемый пост)
говорит что нет такой функции. 

Приведите сигнатуру функции
И приведите код откуда вызываете метод.
PM MAIL   Вверх
boostcoder
Дата 8.8.2011, 00:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



и функция шаблонная.
Код

template<typename A, typename T>
void apply(A&, const T&) {
}


Добавлено @ 00:51
volatile, попробую воспроизвести..

Это сообщение отредактировал(а) boostcoder - 8.8.2011, 00:55
PM WWW   Вверх
volatile
Дата 8.8.2011, 01:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(boostcoder @  8.8.2011,  00:51 Найти цитируемый пост)
попробуй воспроизвести.. 

Воспроизвёл:
Код

typedef int A; // непонятно что за A в шаблоне стркутуры, поэтому это ввел 

template<bool, bool, typename T>
struct type {
   template<typename T>
   static void apply(A& a, const T& v) {
      std::cout << " metod " << std::endl;
      ::apply(a, v); // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
   }
};


template<typename A, typename T>
void apply(A&, const T&) {
      std::cout << " free " << std::endl;
}

int main(int argc, char* const argv[])
{
   int a,b;
   type<0,0,int>::apply ( a,b );
}

выход:
Код

 metod
 free


Добавлено через 2 минуты и 39 секунд
Цитата(boostcoder @  8.8.2011,  00:51 Найти цитируемый пост)
попробую воспроизвести..

А, понятно.  smile . Я думал надо мне воспроизвести....
PM MAIL   Вверх
boostcoder
Дата 8.8.2011, 01:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



volatile, на основе твоего кода и воспроизвел:
Код

#include <iostream>

//typedef int A; // непонятно что за A в шаблоне стркутуры, поэтому это ввел 

template<bool, bool, typename T>
struct type {
   template<typename A>
   static void apply(A& a, const T& v) {
      std::cout << " metod " << std::endl;
      ::apply(a, v); // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
   }
};

template<typename A, typename T>
void apply(A&, const T&) {
      std::cout << " free " << std::endl;
}

int main(int argc, char* const argv[])
{
   int a,b;
   type<0,0,int>::apply ( a,b );
}


http://liveworkspace.org/code/656467edfa39...f2749d7aa32a974
Цитата

source.cpp: In static member function 'static void type<<anonymous>, <anonymous>, T>::apply(A&, const T&)':
source.cpp:10:7: error: '::apply' has not been declared

PM WWW   Вверх
mes
Дата 8.8.2011, 01:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(boostcoder @  8.8.2011,  00:17 Найти цитируемый пост)
 на основе твоего кода и воспроизвел:

поменяйте местами структуру и функцию, или просто добавьте перед структурой прототип..

Это сообщение отредактировал(а) mes - 8.8.2011, 01:27


--------------------
PM MAIL WWW   Вверх
volatile
Дата 8.8.2011, 01:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



boostcoder, у меня студия здесь щас запущена. Там компилится без проблем.

На gcc видимо надо соблюдать очередность... хых
http://liveworkspace.org/code/e991d266116e...7770b9e8f27a082
PM MAIL   Вверх
boostcoder
Дата 8.8.2011, 01:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(mes @  8.8.2011,  01:24 Найти цитируемый пост)
или просто добавьте перед структурой прототип

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

Добавлено через 1 минуту и 9 секунд
Цитата(volatile @  8.8.2011,  01:27 Найти цитируемый пост)
видимо надо соблюдать очередность

нельзя. уже описал почему.
PM WWW   Вверх
volatile
Дата 8.8.2011, 01:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(boostcoder @  8.8.2011,  01:32 Найти цитируемый пост)
как быть?

переходить на студию  smile 
PM MAIL   Вверх
azesmcar
Дата 8.8.2011, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



boostcoder

А каким образом предполагается вызывать функцию, которая на момент вызова не задеркларирована? Если именно функция apply не может быть задекларирована выше, то можно написать прототип функции под другим именем (какой нибудь call_apply), который будет вызывать эту функцию, и определить его ниже.

PM   Вверх
boostcoder
Дата 8.8.2011, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(azesmcar @  8.8.2011,  09:44 Найти цитируемый пост)
А каким образом предполагается вызывать функцию, которая на момент вызова не задеркларирована?

нет. она задекларирована раньше. рекурсия возникает понятно почему. не понятно, почему на "::aply()" компилятор говорит что такой функции нет smile 
PM WWW   Вверх
volatile
Дата 8.8.2011, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(boostcoder @  8.8.2011,  11:56 Найти цитируемый пост)
она задекларирована раньше

boostcoder, если задекларировать раньше, то она ведь работает.

http://liveworkspace.org/code/702e65089983...9615fb52762eb00

PM MAIL   Вверх
azesmcar
Дата 8.8.2011, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(boostcoder @  8.8.2011,  11:56 Найти цитируемый пост)
нет. она задекларирована раньше. рекурсия возникает понятно почему. не понятно, почему на "::aply()" компилятор говорит что такой функции нет smile  

покажи код.
PM   Вверх
boostcoder
Дата 8.8.2011, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



вот как это дело организовано в проекте:
Код

#include <iostream>

namespace ns1 {
namespace ns2 {

template<bool, bool, typename T>
struct type;

template<typename T>
struct type<
   true,
   true,
   T
> {
   template<typename A>
   static void apply(A& a, const T& v) {
      std::cout << " method " << std::endl;
      ::apply(a, v); // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
   }
};

} // namespace ns1
} // namespace ns2

template<typename A, typename T>
void apply(A&, const T&) {
      std::cout << " free " << std::endl;
}

int main(int argc, char* const argv[])
{
   int a,b;
   ns1::ns2::type<1,1,int>::apply( a,b );
}


http://liveworkspace.org/code/217bf61f3fc5...d67bad0729fa6b7

я так понимаю: компилятор знает про специализированный шаблон type еще ДО того как он понимает где эту специализацию использовать. так же, к моменту когда он это понимает, он уже и знает о функции apply().
но почему он говорит? :
Цитата

source.cpp: In static member function 'static void ns1::ns2::type<true, true, T>::apply(A&, const T&)':
source.cpp:20:7: error: '::apply' has not been declared




Это сообщение отредактировал(а) boostcoder - 8.8.2011, 12:49
PM WWW   Вверх
azesmcar
Дата 8.8.2011, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(boostcoder @  8.8.2011,  12:48 Найти цитируемый пост)
вот как это дело организовано в проекте:

где здесь декларация функции apply до момента ее вызова?
PM   Вверх
boostcoder
Дата 8.8.2011, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



в 26`ой строке.
ведь компилятор только при нахождении соответствующей специализации пытается вызвать функцию. или что?

Добавлено через 4 минуты и 45 секунд
azesmcar, смотри такой пример:
Код

#include <iostream>

namespace ns1 {
namespace ns2 {

template<bool, bool, typename T>
struct type;

template<typename T>
struct type<
   true,
   true,
   T
> {
   template<typename A>
   static void apply(A& a, const T& v) {
      std::cout << " method " << std::endl;
      apply_function(a, v); // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
   }
};

} // namespace ns1
} // namespace ns2

template<typename A, typename T>
void apply_function(A&, const T&) {
      std::cout << " free " << std::endl;
}

int main(int argc, char* const argv[])
{
   int a,b;
   ns1::ns2::type<1,1,int>::apply( a,b );
}


http://liveworkspace.org/code/fcd5aff8eff3...fe2744c0a621bf3

я всего лишь переименовал free-функцию, и проблема решилась. так что тут проблема не в том где функция объявлена.

Добавлено через 5 минут и 26 секунд
и попробуй любую из единиц изменить на нолик.

Добавлено через 6 минут и 12 секунд
т.е. проблема по всей видимости в том, что имя free-функции совпадает с именем статической функции члена.
PM WWW   Вверх
azesmcar
Дата 8.8.2011, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



boostcoder

OK, все в порядке, не заметил, что там шаблон. 

Цитата(boostcoder @  8.8.2011,  13:01 Найти цитируемый пост)
я всего лишь переименовал free-функцию, и проблема решилась. так что тут проблема не в том где функция объявлена.

видимо бага в GCC.

PM   Вверх
boostcoder
Дата 8.8.2011, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



придется переименовывать smile 
PM WWW   Вверх
boostcoder
Дата 8.8.2011, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(boostcoder @  8.8.2011,  13:01 Найти цитируемый пост)
   template<typename A>
   static void apply(A& a, const T& v) {
      std::cout << " method " << std::endl;
      ::apply_function(a, v); // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
   }

кстати, если указать что функция в глобальном неймспейсе, то так же говорит:
Цитата

source.cpp: In static member function 'static void ns1::ns2::type<true, true, T>::apply(A&, const T&)':
source.cpp:18:7: error: '::apply_function' has not been declared



Это сообщение отредактировал(а) boostcoder - 8.8.2011, 14:01
PM WWW   Вверх
mes
Дата 8.8.2011, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(boostcoder @  8.8.2011,  12:41 Найти цитируемый пост)
придется переименовывать

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



--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 8.8.2011, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(mes @  8.8.2011,  14:17 Найти цитируемый пост)
подобный прием может привести к нежелательным последсвиями

рефакторинг очень часто имеет такие последствия smile 
PM WWW   Вверх
boostcoder
Дата 8.8.2011, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



в общем, переменовал статическую функцию член. оказалось все не так страшно.

всем спасибо.
PM WWW   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0738 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.