' N'的无效模板参数,预期的编译时常量表达式

时间:2012-07-10 11:19:51

标签: c++ templates

我正在创建一个高精度浮点库(用于教育目的),构造函数如下所示。

我们的想法是拥有一个通用构造函数(第一个),然后是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:
    ...
};

1 个答案:

答案 0 :(得分:0)

不要专门构造你的构造函数,使用重载。

#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&) {}