C ++模板用法:更改变量位置会导致编译错误

时间:2017-03-06 07:51:45

标签: c++ linux templates compilation clang

我有一个这样简单的程序:

$ cat testCompile.cpp

    #include<stdio.h>
    int fd[2];
    template<int fd[]>
    void f(){printf("fd\n");}
    int main(){
        f<fd>();
        return 0;
    }

编译并运行它,没问题,它只是打印&#34; fd&#34;。但是,如果我将fd [2]的位置更改为main函数,则无法编译:

    #include<stdio.h>
    template<int fd[]>
    void f(){printf("fd\n");}
    int main(){
        int fd[2];
        f<fd>();
        return 0;
    }

clang报道:

    testCompile.cpp:6:5: error: no matching function for call to 'f'
        f<fd>();
        ^~~~~
    testCompile.cpp:3:6: note: candidate template ignored: invalid
          explicitly-specified argument for template parameter 'fd'
    void f(){printf("fd\n");}
         ^
    1 error generated.

此错误表示什么?怎么了?

1 个答案:

答案 0 :(得分:8)

首先,您需要记住模板是编译时的事情,它全部由编译器处理,并且在运行时没有任何操作。

然后你需要记住,最常见的局部变量处理是将它们放在堆栈上,并且在编译时可能不知道堆栈的位置。

现在如果我们把它们放在一起,因为在编译时不知道堆栈分配对象的位置,只有在运行时,你才能使用堆栈分配(即局部变量)用模板。

它适用于全局变量,因为编译器可以知道对象的实际位置。