3

範囲の明示的な型を取得しようとしています (将来、クラスにフィールドとして格納する必要があるかもしれません)。しかし、何らかの理由で、それはvoid?に評価されます。

#include <iostream>
#include <set>
#include <range/v3/view/transform.hpp>

class Alpha {
public:
  int x;
};

class Beta : public Alpha {

};

class Foo {
public:
  std::set<Alpha*> s;

  using RangeReturn = decltype(std::declval<std::set<Alpha*>>() | ranges::v3::view::transform(std::function<Beta*(Alpha*)>()));
  RangeReturn r();
};

Foo::RangeReturn Foo::r() {
  return s | ranges::v3::view::transform([](Alpha* a) { return static_cast<Beta*>(a); });
}

int main() {
}

g++ -std=c++17 でコンパイルすると、

main.cpp:24:88: error: return-statement with a value, in function returning 'void' [-fpermissive]

(g++ バージョン g++ (Ubuntu 7.3.0-27ubuntu1~18.04) 7.3.0)

Visual Studio 2017 v. 15.9 で同様のエラーが発生する


この質問は、私の他の質問の続きです: How to store a range as a field in a class? しかし、より具体的であり、分離するに値すると私は信じています。

4

1 に答える 1