2016-01-27 2 views
1

Lest рассмотрим следующий код:Виртуальные методы класса базового шаблона C++ не отображаются в производном?

#include <iostream> 

template <typename T_VAL>  // not used template argument 
struct Foo {  int x; }; 

template <typename T_VAL> 
struct Bar {  int x; }; 

template <typename T_VALUE> 
struct A 
{ 
    // just 2 overloaded data() members: 

    virtual void data(Foo<T_VALUE>) { 
     std::cout << "FOO EMPTY\n"; 
    } 

    virtual void data(Bar<T_VALUE>) { 
     std::cout << "BAR EMPTY\n"; 
    } 
}; 


template <typename T_VALUE> 
struct B : public A<T_VALUE> 
{ 
    void data(Foo<T_VALUE>) { 
     std::cout << "smart FOO impl\n"; 
    } 
}; 


int main(void) { 

    B<float> TheObject; 
    Bar<float> bar; 

    TheObject.data(bar); // I expect virtual base call here 
    return 0; 
} 

Сообщение Компилятор:

tmpl.cpp: In function 'int main()': 
tmpl.cpp:43:14: error: no matching function for call to 'B<float>::data(Bar<float>&)' 
    TheObject.data(bar); 
        ^

void data(Bar<T_VALUE>) ->void data(Bar<T_VALUE>&) ничего не меняет

Почему производный класс B не имеет виртуальные недействительные данные (Бар &)?

ответ

6

Осталось data.

ли

template <typename T_VALUE> 
struct B : public A<T_VALUE> 
{ 
    using A<T_VALUE>::data; // Add this line 
    void data(Foo<T_VALUE>) { 
     std::cout << "smart FOO impl\n"; 
    } 
};