2013-11-26 2 views
0

Может кто-нибудь посоветовать по этому:Nebulous C++ Ошибка компиляции

In file included from recorders/r5000channel.h:13:0, 
      from recorders/r5000channel.cpp:11: 
recorders/dtvchannel.h:53:18: warning: ‘virtual bool DTVChannel::Tune(const IPTVTuningData&)’ was hidden [-Woverloaded-virtual] 
virtual bool Tune(const IPTVTuningData&) { return false; } 
      ^
In file included from recorders/r5000channel.cpp:11:0: 
recorders/r5000channel.h:29:18: warning: by ‘virtual bool R5000Channel::Tune(const DTVMultiplex&, QString)’ [-Woverloaded-virtual] 
virtual bool Tune(const DTVMultiplex &/*tuning*/, QString /*inputname*/) 
      ^
In file included from recorders/r5000channel.h:13:0, 
      from recorders/r5000channel.cpp:11: 
recorders/dtvchannel.h:65:18: warning: ‘virtual bool DTVChannel::Tune(const QString&, int)’ was hidden [-Woverloaded-virtual] 
virtual bool Tune(const QString &freqid, int finetune) 
      ^
In file included from recorders/r5000channel.cpp:11:0: 
recorders/r5000channel.h:29:18: warning: by ‘virtual bool R5000Channel::Tune(const DTVMultiplex&, QString)’ [-Woverloaded-virtual] 
virtual bool Tune(const DTVMultiplex &/*tuning*/, QString /*inputname*/) 
      ^
In file included from recorders/r5000channel.h:13:0, 
      from recorders/r5000channel.cpp:11: 
recorders/dtvchannel.h:71:18: warning: ‘virtual bool DTVChannel::Tune(uint64_t, QString)’ was hidden [-Woverloaded-virtual] 
virtual bool Tune(uint64_t frequency, QString inputname) 
      ^
In file included from recorders/r5000channel.cpp:11:0: 
recorders/r5000channel.h:29:18: warning: by ‘virtual bool R5000Channel::Tune(const DTVMultiplex&, QString)’ [-Woverloaded-virtual] 
virtual bool Tune(const DTVMultiplex &/*tuning*/, QString /*inputname*/) 

r5000channel.h - https://pastee.org/rjajf

r5000channel.cpp - https://pastee.org/qangy

+0

Невозможно обнаружить ошибки, предупреждения! Каков соответствующий код? –

+1

В нем говорится, что метод был скрыт. [Мне не нравится ссылаться на Google] (https://www.google.com/search?q=c%2B%2B+method+hiding&rlz=1C5CHFA_enUS557US557&oq=c%2B%2B+method+hiding&aqs=chrome..69i57j0l5. 2302j0j7 & sourceid = chrome & espv = 210 & es_sm = 91 & ie = UTF-8), но поиск «скрытия метода С ++» даст вам больше ресурсов, чем я могу в этом небольшом комментарии. – Cornstalks

+0

Я бы спросил об этом в списке рассылки MythTV. Поскольку вы не программист на C++. Возможно, разработчик может помочь с портом. – drescherjm

ответ

2

Обратите внимание, что это не ошибка, а предупреждение. Кажется, что ваши базовые классы содержат перегруженную версию функции virtual с именем Tune: при переопределении одного из них все версии в базах скрыты при использовании производного объекта. Обычно это непреднамеренно, и нормальный подход к работе с перегруженными функциями virtual состоит в том, чтобы сделать функции virtualprotected, делегируя им функцию перенаправления public (и, возможно, inline). См., Например, функции virtual в std::num_get<...>.

Другой подход, чтобы избежать скрытия, заключается в предоставлении using-декаляций вместе с переопределениями функций virtual. Лично я предпочитаю подход пересылки.

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

Вот SSCCE показывает проблему и, в комментариях, исправление:

struct base 
{ 
    virtual void foo(int) {} 
    virtual void foo(bool) {} 
}; 

struct derived: base 
{ 
    virtual void foo(int) {} 
    // add this: using base::foo; 
}; 

int main() 
{ 
} 

При составлении приведенной выше коды с я получаю эти сообщения (сокращенно только показать версию компилятора и предупреждение):

$ g++ -v -c -Woverloaded-virtual overloaded-virtual.cpp 
[...] 
GNU C++ (GCC) version 4.9.0 20131031 (experimental) (x86_64-apple-darwin13.0.0) 
    compiled by GNU C version 4.9.0 20131102 (experimental), GMP version 5.0.5, MPFR version 3.1.1, MPC version 1.0.1 
[...] 
overloaded-virtual.cpp:4:22: warning: ‘virtual void base::foo(bool)’ was hidden [-Woverloaded-virtual] 
     virtual void foo(bool) {} 
        ^
overloaded-virtual.cpp:9:22: warning: by ‘virtual void derived::foo(int)’ [-Woverloaded-virtual] 
     virtual void foo(int) {} 
        ^

При добавлении комментария предупреждения уходят (как и ожидалось).

+0

Спасибо, Дитмар. Я не опытный кодер, поэтому неясно, что вы говорите, должно быть сделано. Я замечаю, что большинство ошибок относятся к DTV (DirecTV), которые не будут использоваться для моих целей. Это спутниковая система -другая, чем тарелка, которая является целевой системой. Я хотел бы исправить эти предупреждения, если бы это было довольно просто. dtvchannel.h находится здесь: https://pastee.org/qtumd – user3033518

+0

@ user3033518: В каждом классе, переопределяющем только подмножество перегрузок 'Tune()', вы можете использовать 'using :: Tune;' где '' is имя соответствующего базового класса. Это должно задушить предупреждения. Обратите внимание, однако, что он также может изменить семантику, поскольку он изменяет функции, найденные для разрешения перегрузки. –

+0

Я не достаточно знаком с C, чтобы следовать. Начиная с первого предупреждения проблема кажется в dtvchannel.h, строка 53. Я считаю, что вы говорите, что скрывает Tune(), потому что раньше она использовалась, но я не понимаю, где поставить «using :: Tune; 'или как определить класс. (Извините) – user3033518