2013-08-09 3 views
0

Так спасибо this answer Я ищу реализацию моей проблемы с CRTP. Однако у меня есть проблема. В моем статическом базовом классе у меня есть 2 набора функций. Один принимает std :: векторы, а один берет стандартный массив C-style. Поэтому в базовом классе я определяю статическую функцию, которая вызывает функцию non-std :: vector.Любопытно повторяющийся шаблон Шаблон и статика в базовом классе

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

template< class Derived > class Base 
{ 
public: 
    static void Func(std::vector<float>& buffer) 
    { 
     Func(&buffer.front(), buffer.size()); 
    } 

    static void Func(float* pBuffer, int size) 
    { 
     Derived::Func(pBuffer, size); 
    } 
}; 

Я тогда определить производный класс следующим образом:

class Derived : public Base<Derived> 
{ 
public: 
    static void Func(float* pBuffer, int size) 
    { 
     // Do stuff 
    } 
}; 

Однако, когда я пытаюсь вызвать статическую функцию в классе Base:

Derived::Func(stlVec); 

Из производного класса он бросает ошибка компиляции:

error C2665: 'main' : none of the 2 overloads could convert all the argument types 
1>   c:\development\Base.h(706): could be 'void Func(float*, int) 

Я предположил, что я могу вызвать публичный статический элемент, определенный в базовом классе из класса Derived. Это, похоже, не так, однако ... Может ли кто-нибудь предложить обходное решение, которое не означает необходимость реализации функции std :: vector в каждом из моих классов Derived?

ответ

1

Func в производном классе скрывает все базовые элементы с же именем. Используйте using декларативный, чтобы принести имена из базового класса в производный класс.

class Derived : public Base<Derived> 
{ 
public: 

    using Base<Derived>::Func; 

    //rest.. 
}; 
+0

Ой блин ... Я думал, что это скрыть, только если он принял одни и те же параметры ... что боль :(Можно ли импортировать все функции базовых классов с помощью «с использованием базы < Derived >»? – Goz

+0

@Goz: 'using' declarative приносит * имя * в область действия.Так что вы должны упомянуть о том, что * имя. – Nawaz

+0

И это« нет »в ответ на мой вопрос ... Кажется, боль, чтобы положить этот оператор using для каждой функции, хотя :( – Goz

Смежные вопросы