Ожидаемое выражение перед> токеном в классе шаблона

#c #class #templates #instance #raytracing

#c #класс #шаблоны #экземпляр #трассировка лучей

Вопрос:

Я пытаюсь создать экземпляр класса шаблона внутри одной из его функций, но по какой-то причине я не могу этого сделать. Он сообщает мне об ошибке и указывает на начало строки, что не имеет смысла.

 template<typename O>
class ray{

...

color<O> ray_color(const ray<O>amp; ray, const hittable_list<O>amp; world, O t_Min, O t_Max, int depth){

    hit_record<O> rec;
    if (world.hit(ray, t_Min, t_Max, rec)){
          Vec3<O> target = rec.p   rec.normal   Vec3<O>::random_in_unit_sphere();
          ray<O> new_ray(rec.p, (target - rec.p));  //line where it fails
          ray.direction() = target - rec.p;
          return ray_color(new_ray, world, t_Min, t_Max, depth-1) * 0.5;
    }
 

Это дает мне эту ошибку:

 Ray.h: In member function ‘color ray::ray_color(const rayamp;, const hittable_listamp;, O, O, int)’:
Ray.h:61:16: error: expected primary-expression before ‘>’ token
ray<O> new_ray(rec.p, (target - rec.p));
     ^
 

Что также приводит к тому, что new_array не объявляется и выдает последующие ошибки.

Я создал объекты ray в другом месте с тем же синтаксисом, но только этот выдает ошибку. Что дает?

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

Ответ №1:

Один из ваших параметров назван ray , поэтому в теле функции любые ссылки ray ссылаются на этот параметр, а не на имя класса, в котором определена функция.

Решение простое: назовите свой параметр как-нибудь иначе.

Комментарии:

1. Спасибо! Это решило проблему. Я подумал, что не имеет значения, предоставил ли я значения шаблона и конструктора. Компилятор просто останавливается, как только видит луч, и не выполняет дифференцирование?