我试图找到给定范围内的神奇数字,但它给了我错误

时间:2017-12-09 07:38:32

标签: c++ c++11

这给了我一个错误,就像我不能在std :: is_floating_point中使用一样,因为我不是常数。

int main() {
    /* Enter your code here. Read input from STDIN. Print output to STDOUT */ 
     int k=18;
    int prime=0, nonprime=0;
    int N=100;
 int i=1, z=0, a=0, b=0;
 int req = 1;
    for(i=2; i<=N; i++){
         if(std::is_floating_point<i/10>){
            for(z=1; z<=i; z++){
                if((i/z) == i){
                    if((i/z) == 0){
                       prime=prime+1; 
                    }else{
                        nonprime=nonprime+1;
                    }

2 个答案:

答案 0 :(得分:0)

if(std::is_floating_point<i/10>)

i的值在编译时是未知的,因此不能用于扩展模板。

接下来,正如@AdnanY指出的那样,is_floating_point模板期望一个类型不是数字。您可以将表达式转换为decltype

的类型
if(std::is_floating_point<decltype(i/10)>::value)

这也解决了我不是编译时常量的问题。 i的值不是常数,但其类型是。请注意那里的::value。展开模板后,您需要::value才能获得结果bool

最后一点,i/10一直是整数除法,所以结果保证是一个整数。 if将始终测试为false并跳过正文。

以下是一些示例代码:

#include <iostream>
#include <type_traits>

int main() {
    for (int i=1; i < 1000; i++)
        std::cout << std::boolalpha
                  << std::is_floating_point<decltype(i/10)>::value
                  << '\n';
}

您可以将循环的上限设置为您想要的任何内容,并且您永远不会得到任何错误。

答案 1 :(得分:0)

如果您坚持使用template,则必须制作compile-time loop轮:

这是c ++ 11的一个很好的参考(减少了难度):https://www.codeproject.com/Articles/857354/Compile-Time-Loops-with-Cplusplus-Creating-a-Gener

然后,欢迎来到黑魔法:)