4

メンバー関数の戻り値の型に 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です。何を与える?

4

1 に答える 1

8

これは、私がここで報告したgcc 4.7のバグです:バグ#54359(バグレポートの下部を参照)。この特定のケースはgcc4.6で受け入れられます。

回避策として、末尾のリターンタイプを使用せず、メンバーのタイプをx直接使用してください。この例では、これは単純Tですが、より複雑なケースを変換することもできます。たとえば、次のように変換できます。

T x;
auto f() -> decltype(x.foo);

の中へ:

T x;
decltype(std::declval<T>().foo) f();

std::declvalはここで非常に便利です。

于 2012-09-11T07:58:10.640 に答える