2015-03-10 3 views
1

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

Ниже его декларация

template <class T> 
class Interpolatable 
{ 
    // The function calculates an interpolated value 
    // along the fraction t between 0.0 and 1.0. 
    // When t = 1.0, endValue is returned. 
    virtual T interpolate(const T &endValue, float t)=0; 
}; 

struct Vertex: public Interpolatable<?????????> 
{ 
    float x, y, z; 

    Vertex()=default; 
    Vertex(float, float, float); 

    virtual Vertex &interpolate(const Vertex &endValue, float t) const; 
}; 

Можно ли сделать интерполировать возвращение метод Vertex в экземпляр Vertex? Компилятор продолжает давать мне ошибки

+0

STRUCT Vertex: общественный интерполируемые Хотите использовать CRTP? –

+0

'struct Vertex: интерполяционный ' должен работать. Обратите внимание, что вам нужно вернуть 'Vertex', ** not **' Vertex & ' – BoBTFish

+0

Кажется, вы пропустили' T const & beginValue', чтобы вернуться для случая 't == 0'. – MSalters

ответ

2

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

struct Vertex: public Interpolatable<Vertex> 

virtual T interpolate(const T &endValue, float t)=0; 
virtual Vertex &interpolate(const Vertex &endValue, float t) const; 
//    ^reference          ^declared const 

кажется, что ваши подписи должны быть:

virtual T interpolate(const T &endValue, float t) const =0; 
virtual Vertex interpolate(const Vertex &endValue, float t) const; 
1

Он должен работать, если вы исправить три ошибки:

  • ????????? должен быть Vertex
  • interpolate должен возвращать Vertex по стоимость
  • interpolate не должно быть const (или должен быть const в базовом классе)
+0

Можно ли объявлять чистые виртуальные и const-методы одновременно? –

+0

void foo() = 0 const; –

+1

Да, 'void foo() const = 0;' – TartanLlama

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