3

ホーナーの方法を実装しようとしましたが、問題に直面しました:

root@host:~# cat | g++ -x c++ -std=gnu++11 - && ./a.out
#include <iostream>
#include <iomanip>
#include <iterator>
#include <vector>
#include <numeric>
#include <algorithm>
#include <random>
#include <chrono>

#include <cstdlib>

template< typename F >
class horner
{
public :

    typedef std::vector< F > V;

    horner(F const & x_, V const & c_)
        : x(x_)
        , c(c_)
        , y(0.0L)
    { ; }

    operator F const () const
    {
        return std::accumulate(c.rbegin(), c.rend(), *this).y;
    }

private :

    friend horner std::accumulate< typename V::const_reverse_iterator, horner >(typename V::const_reverse_iterator, typename V::const_reverse_iterator, horner);

    void operator = (F const & rhs)
    {
        y = rhs;
    }

    operator F ()
    {
        y *= x;
        return y;
    }

    F const & x;
    V const & c;
    F y;

};

#define N_COEFF_PARABOLA 3

int main()
{
    typedef double F;
    typedef typename horner< F >::V V;

    V c;
    unsigned seed(std::chrono::system_clock::now().time_since_epoch().count());
    std::cout << "seed = 0x"
              << std::uppercase << std::hex << std::setfill('0') << std::setw(sizeof(seed) * 2)
              << seed << std::endl;
    std::mt19937 generator(seed);
    std::generate_n(std::back_inserter(c), N_COEFF_PARABOLA, generator);

    std::cout << "coefficients: ";
    std::copy(c.begin(), c.end(), std::ostream_iterator< F >(std::cout, " "));
    std::cout << ';' << std::endl;

    F const x(generator());
    F const y(horner< F >(x, c));
    std::cout << "y(" << x << ") = " << y << std::endl;

    // naive
    F xx(1.0L);
    F yy(0.0L);
    for (typename V::size_type i(0); i < c.size(); ++i) {
        yy += c[i] * xx;
        xx *= x;
    }
    std::cout << "y'(" << x << ") = " << yy << std::endl;

    return EXIT_SUCCESS;
}
// press ^D

<stdin>: In function ‘int main()’:
<stdin>:39:5: error: ‘horner<F>::operator F() [with F = double]’ is private
<stdin>:71:32: error: within this context
root@host:~#

私の見解では、型変換演算子のバージョンmain()のみが表示されるため、問題は発生しないはずです。operator F const & () constしかし、そうです。

エラーの理由は何ですか?

4

1 に答える 1

4

可視性とアクセシビリティの概念は、C++ では完全に直交しています。メソッドが表示されていてもアクセスできない場合、コンパイラはオーバーロードの解決でそれを選択し、使用できないためハード エラーを生成する可能性があります。これは意図的に行われるため、コードがアクセス権を獲得したり失ったりしたときに、コードが黙ってセマンティクスを変更することはありません。

于 2012-11-01T10:07:44.810 に答える