4

Visual Studio 10 (Beta 2) を試しながら簡単なポイント コードを書いています。SFINAE が作動すると思われる場所でこのコードをヒットしましたが、そうではないようです。

template<typename T>
struct point {
    T x, y;
    point(T x, T y) : x(x), y(y) {}
};

template<typename T, typename U>
struct op_div {
    typedef decltype(T() / U()) type;
};

template<typename T, typename U>
point<typename op_div<T, U>::type>
operator/(point<T> const& l, point<U> const& r) {
    return point<typename op_div<T, U>::type>(l.x / r.x, l.y / r.y);
}

template<typename T, typename U>
point<typename op_div<T, U>::type>
operator/(point<T> const& l, U const& r) {
    return point<typename op_div<T, U>::type>(l.x / r, l.y / r);
}

int main() {
    point<int>(0, 1) / point<float>(2, 3);
}

これは与えるerror C2512: 'point<T>::point' : no appropriate default constructor available

これはベータ版であるため、オンラインの comeau コンパイラで簡単なサニティ チェックを行ったところ、同じエラーに一致するため、この動作は正しいように見えますが、その理由はわかりません。

この場合、いくつかの回避策は、単純に をインライン化するかdecltype(T() / U())、ポイント クラスにデフォルト コンストラクターを与えるか、完全な結果式で decltype を使用することですが、op_div のバージョンで発生していたエラーを単純化しようとしているときに、このエラーが発生しました。デフォルトのコンストラクター*を必要としなかったので、機能することだけを行うのではなく、C++の理解を修正したいと思います.

ありがとう!


*: オリジナル:

template<typename T, typename U>
struct op_div {
    static T t(); static U u();
    typedef decltype(t() / u()) type;
};

を与えerror C2784: 'point<op_div<T,U>::type> operator /(const point<T> &,const U &)' : could not deduce template argument for 'const point<T> &' from 'int'point<T> / point<U>過負荷に対しても。

4

2 に答える 2

2

100%確実ではありません。コンパイラはどちらが優れているかを判断するために両方のオーバーロードをインスタンス化する必要があるようですが、 と を使用して他の op_div をインスタンス化しようとするT = intU = point<float>、SFINAE でカバーされないエラーが発生します (エラーは、op_div に型がないということではありません)。この場合、そのタイプは判別できません)。

2 番目のタイプがポイント ( ) の場合、2 番目のオーバーロードを無効にすることができboost::disable_ifます。

また、機能しているように見えるのは、延期された戻り値の型宣言です (op_div 構造体を廃止しますが、コンパイラでサポートされている C++0x 機能によって異なります)。

template<typename T, typename U>
auto
operator/(point<T> const& l, point<U> const& r) -> point<decltype(l.x / r.x)> {
    return {l.x / r.x, l.y / r.y};
}

template<typename T, typename U>
auto
operator/(point<T> const& l, U const& r) -> point<decltype(l.x / r)> {
    return {l.x / r, l.y / r};
}
于 2009-10-22T12:49:16.197 に答える
-1

あなたのエラーはここにあると思います:

template<typename T>
struct point {
    T x, y;
    point(T x, T y) : x(x), y(y) {}
};

構造体定義を次のように変更します。

template<typename T>
struct point<T> {
    T x, y;
    point(T x, T y) : x(x), y(y) {}
};

ジェネリック型 T を使用する場合は、定義で指定する必要があります。

于 2009-10-22T12:08:05.410 に答える