LINUX.ORG.RU

Напомните, почему из методов класса нельзя вызывать одноимённые функции?

 , ,


1

2
inline std::string to_str(int x){
    return "x";
}


class A {
public:
    std::string to_str(){
        return to_str(10); //too many arguments to function call, expected 0, have 1
    }
};
★★★★★

Последнее исправление: next_time (всего исправлений: 1)

А попробуй так:

::to_str(10);

И да. Как сказали выше. Старайся свой код всегда заворачивать в namespace.

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

да разрулить-то я знаю, как… вопрос - с какого перепугу так сделано? чтобы жизнь мёдом не казалась?

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

да все просто - сначала оно ищет в ближайшем окружении, а уж потом пойдет глобальнее.

deep-purple ★★★★★
()
Ответ на: комментарий от next_time

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

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

ну он же хочет «причину» прямо в руках подержать, ну по крайней мере я так его понял.

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

Потому что иначе работать не будет. Если смешать функции из разных пространств имён, то может получится ситуация, когда в множестве для разрешения перегрузки будут функции с одинаковой сигнатурой. А с текущей реализацией неоднозначности не будет, потому что это невалидный набор объявлений (хотя using нечто подобное может сделать, но оно более ограничено).

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

Действительно, почему сделали не так как я хочу (здесь и сейчас)? Они чё там вообще охренели?

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

Блин, ну так сделано. Что тут сокрушаться. Нужно просто это принять

Золотой ответ!

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от next_time

так сделано, чтобы разрешить наложение символов и тут либо ::to_str для глобальных функций, либо A::to_str даже внутри класса, но тогда ООП будет совсем грязным делом, особенно в случае вложенности. В общем сделано, чтобы работало и было адекватно и волей неволей напрашивается вопрос, а как иначе интересно ? Запретить рекурсии для методов класса ?

AKonia ★★
()

Напомните, почему из методов класса нельзя вызывать одноимённые функции?

Потому что ты - дебил, и функции на самом деле вызывать можно.

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

Я спи*дел. Так нельзя. Можно поставить using внутри метода, но это не особо короче.

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

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

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

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

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

Аналогии тут не работают.

Аргумент уровня детского сада. Я тоже так могу: твои указания здесь не работают.

C++ — херовый ЯП. «Изобретатели» взяли все свои «свежие» идеи и впихнули в один ЯП безо всякого дизайна. Язык поюзали на безрыбье, а потом инерция.

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

Аргумент уровня детского сада. Я тоже так могу: твои указания здесь не работают.

Какого сада? Ты в качестве аргумента используешь аналогии из вообще другой области (наркотики). Ну бля :-) А каком детском саду вообще тут говорить? Это вообще нелепее некуда.

C++ — херовый ЯП. «Изобретатели» взяли все свои «свежие» идеи и впихнули в один ЯП безо всякого дизайна. Язык поюзали на безрыбье, а потом инерция.

Фух. Молодец, хорошо зазубрил то, что где-то вычитал.

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

с какого перепугу так сделано?

Потому что это правильно

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

я и не копировал, просто показал, как искал и что 0 релевантных результатов по моему запросу

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

хотя using нечто подобное может сделать, но оно более ограничено)

как раз наоборот, using в этом смысле гораздо более деструктивна

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

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

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

целенаправленное вредительство и правда многое объясняет, но всё же - это теории заговора

next_time ★★★★★
() автор топика

Плата за то, что не надо писать selfthis->method_name.

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

Ну это вполне логично, если хотя бы совсем немного подумать:

#include <any_library_include.hh>
void f(int) {} // торчит из заголовочного файла что выше, там объявлен

struct S {
	void f(double) {}
	void call_1(int arg) {...; f(arg);}
	void call_2(double arg) {...; f(arg);}
};

Представь, что глобальная void f(int) идёт с какого-нибудь заголовочника, т.е. ты о ней как бы и не знаешь и мерджить список перегрузок не собирался. Уверен, что хотел бы разрешить S::call_1 вызывать глобальную версию?

Когда имена нужно смерджить из разных пространств имен, то тут должно по идее работать через ADL, аналогично тому как делают using std::swap, т.е. будет один список перегрузок из std::swap и тех своп, что в одном пространстве с аргументом.

маразм

Какая-то гипертрофированная самоуверенность.

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

Пиши на серьезных ЯП

это какие? пример серьезного языка можете привести?

Assembler
()

Альтернативу такому поведению можно посмотреть, например, в python'е, где в методах надо постоянно писать self. Чуз ёр файтер, как грится.

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

Этим следовало бы ограничиться. Надоели эти вечные беседы о проектировании ЯП с макаками.

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

Для brainfuck этот работает, потому что его описание занимает одну страницу в википедии.

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

Не нужно быть серьезным специалистом по коболу, чтобы знать, что не надо писать на коболе.

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

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

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

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