2017-03-06 39 views
1

我有一個簡單的程序是這樣的:C++模板用法:改變變量的地方會導致編譯錯誤

$貓testCompile.cpp

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

編譯並運行它,沒有問題,它只是打印「fd」。但是,如果我改變FD [2]的位置爲主要功能則無法編譯:

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

鐺報道:

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. 

這個錯誤是什麼指示?哪裏不對了?

回答

8

首先您需要記住的是,模板是編譯時的東西,它全部由編譯器處理,在運行時不做任何事情。

然後,您需要記住,最常見的局部變量處理是將它們放在堆棧上,並且在編譯時可能不知道堆棧的位置。

現在,如果我們把它放在一起,因爲堆棧分配對象的位置在編譯時不知道,只有在運行時才能使用堆棧分配(即局部變量)與模板。

它適用於全局變量,因爲編譯器可以知道對象的實際位置。

+0

對不起,數組在這種情況下會衰減指針;) –

+0

我認爲模板是基於對象的數據類型而不是由對象的位置實例化的。如果是這種情況,那麼局部變量和全局變量之間沒有區別。 –

+0

我看,它會吐出錯誤,因爲它將無法找到局部變量在內存中分配的位置,但我不瞭解全局變量。 –