запрос на участника' …' неоднозначен в g ++

Компилятор не заботится, написан ли Ваш код чисто или нечитабельная путаница - пока синтаксис правилен, код скомпилирует, и это будет работать.

Однако , когда дело доходит до обслуживания кода, чисто написанный код для людей будет очень полезным. С точки зрения экономической модели, чем короче это берет для понимания кода для нового программиста, тем меньше денег требуется, чтобы приносить новому человеку до скорости. Поэтому более чистый код имеет больше ценности. Какой смысл, когда нечитабельный код работает на 5% быстрее, когда потребуется на 100% больше времени для понимания программистом? В конце концов, программисты стоят довольно мало деньги.

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

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

Запись для людей, не машина.

10
задан cheshirekow 21 August 2009 в 17:15
поделиться

1 ответ

Looks like your situation is like this:

struct A {
  void f();
};

struct B {
  void f(int);
};

struct C : A, B { };

int main() { 
  C c; 
  c.B::f(1); // not ambiguous
  c.f(1);    // ambiguous
}

The second call to f is ambiguous, because in looking up the name, it finds functions in two different base class scopes. In this situation, the lookup is ambiguous - they don't overload each other. A fix would be to use a using declaration for each member name. Lookup will find names in the scope of C and don't lookup further:

struct C : A, B { using A::f; using B::f; };

Now, the call would find two functions, do overload resolution, and find that the one taking int will fit. Carried over to your code, it would mean that you have to do something like the following

struct controller : ISource<const SConsolePacket&>, ISource<const SControlPacket&> {
  using ISource<const SConsolePacket&>::addListener;
  using ISource<const SControlPacket&>::addListener;
};

Now, the two names are in the same scope, and now they can overload each other. Lookup will now stop at the controller class, not diving further into the two base-class branches.

24
ответ дан 3 December 2019 в 16:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: