Одинаковое имя функции на двух интерфейсах
От: Caracrist https://1pwd.org/
Дата: 24.05.17 16:53
Оценка:
struct S1
{
    virtual int f() = 0;
};

struct S2
{
    virtual void f() = 0;
};
struct SS : S1, S2
{
    virtual void f() override
    {
    }
    virtual int f() override
    {
    }
};

Error 'int SS::f(void)': overloaded function differs only by return type from 'void SS::f(void)'
Error 'SS::f': redefinition; different basic types
Error 'SS::f': overriding virtual function return type differs and is not covariant from 'S1::f'

~~~~~
~lol~~
~~~ Single Password Solution
Re: Одинаковое имя функции на двух интерфейсах
От: cures Россия cures.narod.ru
Дата: 24.05.17 17:52
Оценка:
Здравствуйте, Caracrist, Вы писали:

Error 'int SS::f(void)': overloaded function differs only by return type from 'void SS::f(void)'
Error 'SS::f': redefinition; different basic types
Error 'SS::f': overriding virtual function return type differs and is not covariant from 'S1::f'


И? Как она должна была бы вести себя в этом классе?
Re: Одинаковое имя функции на двух интерфейсах
От: RonWilson Россия  
Дата: 24.05.17 18:38
Оценка:
Здравствуйте, Caracrist, Вы писали:

предположим, так — и как теперь вызывать?

struct SS : S1, S2
{
    virtual void S1::f() override
    {
    }
    virtual int S2::f() override
    {
    }
};
Отредактировано 24.05.2017 18:39 RonWilson . Предыдущая версия .
Re: Одинаковое имя функции на двух интерфейсах
От: rg45 СССР  
Дата: 24.05.17 19:28
Оценка: 4 (1)
Здравствуйте, Caracrist, Вы писали:

C>
C>struct S1
C>{
C>    virtual int f() = 0;
C>};

C>struct S2
C>{
C>    virtual void f() = 0;
C>};
C>struct SS : S1, S2
C>{
C>    virtual void f() override
C>    {
C>    }
C>    virtual int f() override
C>    {
C>    }
C>};
C>

C>

C>Error 'int SS::f(void)': overloaded function differs only by return type from 'void SS::f(void)'
C>Error 'SS::f': redefinition; different basic types
C>Error 'SS::f': overriding virtual function return type differs and is not covariant from 'S1::f'


Что ты хотел этим выразить: ты не понимаешь, почему возникает эта ошибка, или спрашиваешь, как это можно обойти?
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[2]: Одинаковое имя функции на двух интерфейсах
От: Caracrist https://1pwd.org/
Дата: 24.05.17 23:05
Оценка:
Здравствуйте, RonWilson, Вы писали:

RW>предположим, так — и как теперь вызывать?


void F1(S1 * asS1)
{
 asS1->f();
}

int F2(S2 * asS2)
{
 return asS2->f();
}


RW>
RW>struct SS : S1, S2
RW>{
RW>    virtual void S1::f() override
RW>    {
RW>    }
RW>    virtual int S2::f() override
RW>    {
RW>    }
RW>};
RW>


это где то компилируется?

Visual Studio 2015

Error 'SS::f': overriding virtual function return type differs and is not covariant from 'S1::f'
Error 'SS::f': method with override specifier 'override' did not override any base class methods

~~~~~
~lol~~
~~~ Single Password Solution
Re[2]: Одинаковое имя функции на двух интерфейсах
От: Caracrist https://1pwd.org/
Дата: 24.05.17 23:06
Оценка:
Здравствуйте, cures, Вы писали:

C>И? Как она должна была бы вести себя в этом классе?


кто "она"? Это две разные функции разных интерфейсов от которых по стечению обстоятельств наследует этот класс.
~~~~~
~lol~~
~~~ Single Password Solution
Re[2]: Одинаковое имя функции на двух интерфейсах
От: Caracrist https://1pwd.org/
Дата: 24.05.17 23:08
Оценка:
Здравствуйте, rg45, Вы писали:

R>Что ты хотел этим выразить: ты не понимаешь, почему возникает эта ошибка, или спрашиваешь, как это можно обойти?


Спрашиваю как можно обойти.
~~~~~
~lol~~
~~~ Single Password Solution
Re[3]: Одинаковое имя функции на двух интерфейсах
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 24.05.17 23:46
Оценка: +2
Здравствуйте, Caracrist, Вы писали:

R>>Что ты хотел этим выразить: ты не понимаешь, почему возникает эта ошибка, или спрашиваешь, как это можно обойти?


C>Спрашиваю как можно обойти.


Можно сделать промежуточные классы, реализовать f в них, и унаследоваться от них:
struct S1
{
    virtual int f() = 0;
};

struct S1Impl : S1
{
    int f() { return 0; }
};


struct S2
{
    virtual void f() = 0;
};

struct S2Impl : S2
{
    void f() {}
};

struct SS : S1Impl, S2Impl
{
};


Других путей не вижу. Может, мегамозги что-нибудь и придумают еще

Но вообще, странная ситуация. Я вовсю использую интерфейсы, и никогда не попадал на такое — обычно методы имеют более осмысленное имя, которое не совпадает ни с чем другим, или у методов разные наборы входных параметров
Маньяк Робокряк колесит по городу
Re[4]: Одинаковое имя функции на двух интерфейсах
От: Caracrist https://1pwd.org/
Дата: 24.05.17 23:58
Оценка:
Здравствуйте, Marty, Вы писали:

M>Но вообще, странная ситуация. Я вовсю использую интерфейсы, и никогда не попадал на такое — обычно методы имеют более осмысленное имя, которое не совпадает ни с чем другим, или у методов разные наборы входных параметров


Вот примерно такое у меня:
template<class T>
struct IGetter
{
  virtual T Get() = 0;
};

template<class T>
struct SomeGetterImpl : IGetter<T>, enable_shared_from_this
{
  T Get() 
  {
  // code...
  }
};


template<class T>
struct AnotherGetterImpl : IGetter<T>, SomeGetterImpl<Container<T>> //, enable_shared_from_this
{
  T Get() 
  {
   return SomeGetterImpl<Container<T>>::Get().Value;
  }
};


Я мог бы SomeGetterImpl поставить мембером, но тогда изза enable_shared_from_this мне придется держать его в поинтере, что добавит лишнюю аллокацию (или 2).
Напрямую, не через интерфейс, с этим классом никто не работает.
~~~~~
~lol~~
~~~ Single Password Solution
Re[4]: Одинаковое имя функции на двух интерфейсах
От: Caracrist https://1pwd.org/
Дата: 25.05.17 00:10
Оценка:
Здравствуйте, Marty, Вы писали:

M>Других путей не вижу. Может, мегамозги что-нибудь и придумают еще


В C++/CLI есть вот такая красота:

struct S1
{
    virtual int f() = 0;
};

struct S2
{
    virtual void f() = 0;
};
struct SS : S1, S2
{
    virtual int f1() = S1::f
    {
        return 1;
    }
    virtual void f2() = S2::f
    {
    }
};


Но у меня нативный класс...
~~~~~
~lol~~
~~~ Single Password Solution
Re[5]: Одинаковое имя функции на двух интерфейсах
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 25.05.17 00:19
Оценка:
Здравствуйте, Caracrist, Вы писали:

M>>Других путей не вижу. Может, мегамозги что-нибудь и придумают еще


C>В C++/CLI есть вот такая красота:


Кстати, может в последних стандартах что-то подобное есть, я не в курсе
Маньяк Робокряк колесит по городу
Re[3]: Одинаковое имя функции на двух интерфейсах
От: RonWilson Россия  
Дата: 25.05.17 06:39
Оценка:
Здравствуйте, Caracrist, Вы писали:

C>Здравствуйте, RonWilson, Вы писали:


RW>>предположим, так — и как теперь вызывать?


мне хотелось, чтобы ТС объяснил как теперь это вызывать

C>это где то компилируется?
Re[4]: Одинаковое имя функции на двух интерфейсах
От: jazzer Россия Skype: enerjazzer
Дата: 25.05.17 07:02
Оценка: 4 (1)
Здравствуйте, RonWilson, Вы писали:

RW>мне хотелось, чтобы ТС объяснил как теперь это вызывать


Очевидно, по указателю на один из интерфейсов
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[5]: Одинаковое имя функции на двух интерфейсах
От: RonWilson Россия  
Дата: 25.05.17 07:04
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Здравствуйте, RonWilson, Вы писали:


RW>>мне хотелось, чтобы ТС объяснил как теперь это вызывать


J>Очевидно, по указателю на один из интерфейсов


Re[3]: Одинаковое имя функции на двух интерфейсах
От: Erop Россия  
Дата: 25.05.17 08:09
Оценка:
Здравствуйте, Caracrist, Вы писали:

C>кто "она"? Это две разные функции разных интерфейсов от которых по стечению обстоятельств наследует этот класс.


А твоя проблема в чём? Просто не переопределяй эти функции в этом классе...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[4]: Одинаковое имя функции на двух интерфейсах
От: Erop Россия  
Дата: 25.05.17 08:11
Оценка:
Здравствуйте, Marty, Вы писали:

M>Но вообще, странная ситуация. Я вовсю использую интерфейсы, и никогда не попадал на такое — обычно методы имеют более осмысленное имя, которое не совпадает ни с чем другим, или у методов разные наборы входных параметров


Ну, например при COW, метод Release может возвращать счётчик, а может не возвращать.
Или, в одном интерфейсе метод может иметь тип void, а в другом возвращать код ошибки и т. д...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[5]: Одинаковое имя функции на двух интерфейсах
От: rg45 СССР  
Дата: 25.05.17 08:13
Оценка:
Здравствуйте, Caracrist, Вы писали:

C>Здравствуйте, Marty, Вы писали:


M>>Но вообще, странная ситуация. Я вовсю использую интерфейсы, и никогда не попадал на такое — обычно методы имеют более осмысленное имя, которое не совпадает ни с чем другим, или у методов разные наборы входных параметров


C>Вот примерно такое у меня:

C>
C>template<class T>
C>struct IGetter
C>{
C>  virtual T Get() = 0;
C>};

C>template<class T>
C>struct SomeGetterImpl : IGetter<T>, enable_shared_from_this
C>{
C>  T Get() 
C>  {
C>  // code...
C>  }
C>};


C>template<class T>
C>struct AnotherGetterImpl : IGetter<T>, SomeGetterImpl<Container<T>> //, enable_shared_from_this
C>{
C>  T Get() 
C>  {
C>   return SomeGetterImpl<Container<T>>::Get().Value;
C>  }
C>};
C>


C>Я мог бы SomeGetterImpl поставить мембером, но тогда изза enable_shared_from_this мне придется держать его в поинтере, что добавит лишнюю аллокацию (или 2).

C>Напрямую, не через интерфейс, с этим классом никто не работает.

Я не понял, почему так важно IGetter и enable_shared_from_this объединить в одном классе (SomeGetterImpl) — ведь именно это объединение мешает сделать SomeGetterImpl членом, вместо того, чтобы наследоваться от него. Но, не вдаваясь в эти подробности, один из варантов обхода (эскизно) мог бы выглядеть так:

http://ideone.com/SUZcqI
template<typename T>
struct IGetter
{
  virtual T Get() = 0;
};

template<typename T>
struct SomeGetterImpl : IGetter<T>, enable_shared_from_this
{
  T Get() { /*...*/ }
};


template<typename T, typename DerivedT>
struct AnotherGetterImpl : IGetter<T>
{
  T Get() { return static_cast<DerivedT*>(this)->GetValue(); }
};

template <typename T>
struct CompositeImpl : SomeGetterImpl<Container<T>>, AnotherGetterImpl<T, CompositeImpl<T>>
{
    using AnotherGetterImpl<T, CompositeImpl>::Get;

    T GetValue() { return SomeGetterImpl<Container<T>>::Get().Value; }    
};
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[5]: Одинаковое имя функции на двух интерфейсах
От: Erop Россия  
Дата: 25.05.17 08:17
Оценка:
Здравствуйте, Caracrist, Вы писали:

C>Вот примерно такое у меня:

C>
C>template<class T>
C>struct IGetter
C>{
C>  virtual T Get() = 0;
C>};

C>


А этот IGetter твой?
Можно, например, сделать так:
template<class T>
struct IGetter
{
  virtual T Get(const T* dummy = 0) = 0;
}
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[5]: Одинаковое имя функции на двух интерфейсах
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 25.05.17 09:10
Оценка:
Здравствуйте, Erop, Вы писали:

M>>Но вообще, странная ситуация. Я вовсю использую интерфейсы, и никогда не попадал на такое — обычно методы имеют более осмысленное имя, которое не совпадает ни с чем другим, или у методов разные наборы входных параметров


E>Ну, например при COW, метод Release может возвращать счётчик, а может не возвращать.


Ну, у меня все Release'ы от одного базового интерефейса, всегда счетчик возвращают


E>Или, в одном интерфейсе метод может иметь тип void, а в другом возвращать код ошибки и т. д...


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

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