   const int num_values_per_key = 32;
 
   auto input = this->create_input(num_keys, num_values_per_key);
-  auto expected_values = this->compute_reference_solution();
+  // When you have a templated member function of a templated class, the preceeding 'template' keyword is required
+  // See: https://stackoverflow.com/questions/16508743/error-expected-expression-in-this-template-code
+  using aggregation_op = typename GroupByTest<TypeParam>::op_type;
+  auto expected_values = this->template compute_reference_solution<aggregation_op>();
 
   this->build_aggregation_table_device(input);
   this->verify_aggregation_table(expected_values);

  const int num_keys = 1<<12;
  const int num_values_per_key = 1;
  auto input = this->create_input(num_keys, num_values_per_key);
  auto expected_values = this->compute_reference_solution();

  this->build_aggregation_table_device(input);
  this->verify_aggregation_table(expected_values);

    const auto end = this->d_groupby_column.end();
    thrust::sort(begin, end);
    size_t unique_count = thrust::unique(begin, end) - begin;
    ASSERT_EQ(unique_count, computed_result_size);

    // Prefetch groupby and aggregation result to host to improve performance
    cudaMemPrefetchAsync(d_groupby_result, input_size * sizeof(key_type), cudaCpuDeviceId);
    cudaMemPrefetchAsync(d_aggregation_result, input_size * sizeof(value_type), cudaCpuDeviceId);

    // Verify that every <key,value> in the computed result is present in the reference solution
    for(size_type i = 0; i < expected_values.size(); ++i)
    {
      key_type groupby_key = d_groupby_result[i];
