2

高精度の浮動小数点ライブラリ(教育目的)を作成しています。コンストラクターを以下に示します。

アイデアは、ジェネリックコンストラクター(最初のコンストラクター)と、std::stringおよびstd::bitset用の2つの特殊なコンストラクターを用意することです。

問題は、両方の特殊なコンストラクターに対して「エラーC2975:'Float':'N'の無効なテンプレート引数、予期されるコンパイル時定数式」を取得し続けることです。

誰かがこれを修正する方法を教えてもらえますか?

前もって感謝します!

template<typename T>
Float(T n) {
    type_wrapper<T> data;
    data.in = n;
    bits = std::bitset<N>(data.out);
    _overflow = false;
}

template<>
Float< const std::bitset<N> >(const std::bitset<N> bits) {
    this->bits = bits;
    _overflow = false;
}

template<>
Float< const std::string& >(const std::string& s) {
    int n = std::min(N, s.length());
    for(int i = 0; i < n; i++) {
        bits[n-i-1] = (s.at(i) == '1' ? 1 : 0);
    }
    _overflow = false;
}

編集:私はおそらく、私が実際に次のような一定のサイズでFloatオブジェクトを構築していることを追加する必要があります:

int main(int argc, char* argv[])
{
    Float<64> number("01011001100010001110010101100111");   //1502143847
    std::cout << number << std::endl;

    std::cin.get();
    return 0;
}

また、テンプレート化された引数'N'は、次のようなクラス定義からのものです。

template<size_t N>
class Float
{
private:
    ...
public:
    ...
};
4

1 に答える 1

1

コンストラクターを特殊化せず、オーバーロードを使用してください。

#include <cstdint>
#include <bitset>
#include <string>
#include <iostream>
template<std::size_t N>
class Float
{
private:

public:
  template<typename T>
  Float(const T& n) {
  }

  Float(const std::bitset<N>& bits) {
  }

  Float(const std::string& s) {
  }
};

int main()
{
    Float<64> number("01011001100010001110010101100111");   //1502143847

    std::cin.get();
    return 0;
}

元のエラーはおそらく、構成を定義するときに構成を完全に修飾していないことが原因です。これは次のようになります。

template<std::size_t N>
template<>
Float<N>::Float<const std::string&>(const std::string&) {}
于 2012-07-10T11:59:35.583 に答える