メンバー関数の戻り値の型に decltype を使用していますが、定義と宣言が一致しません。ここにいくつかのコードがあります:
template<typename T>
struct A {
T x;
auto f() -> decltype(x);
};
template<typename T>
auto A<T>::f() -> decltype(x) {
return this->x;
}
int main() {}
これにより、
test.cc:10:6: error: prototype for 'decltype (((A<T>*)0)->A<T>::x) A<T>::f()' does not match any in class 'A<T>'
test.cc:6:7: error: candidate is: decltype (((A<T>*)this)->A<T>::x) A<T>::f()
違いは、定義に(A<T>*)0
は宣言がある場所があるということ(A<T>*)this
です。何を与える?