2012-04-17 122 views
7

下面給出的示例代碼沒有在g ++中編譯。但它正在開發視覺工作室。 是有可能使用模板成員函數模板類中的G ++爲什麼這個代碼不能在g ++中編譯

class Impl 
{ 
public: 
     template<class I> 
     void Foo(I* i) 
     { 

     } 
}; 

template<class C> 
class D 
{ 
public: 
     C c; 
     void Bar() 
     { 
       int t = 0; 
       c.Foo<int>(&t); 
     } 
}; 

int main() 
{ 
     D<Impl> d; 
     d.Bar(); 
     return 0; 
} 
+5

你看到什麼錯誤? – Nick 2012-04-17 07:39:37

回答

9

因爲有問題的陳述取決於模板參數,編譯器不允許內省C,直到實例化。你必須告訴它你的意思是一個函數模板:

c.template Foo<int>(&t); 

如果你不把template那裏,聲明是模糊的。爲了理解,想象一下以下C

class C { const int Foo = 5; }; 
... 
c.Foo<int>(&t); 

它看起來編譯器,如果你比較一個const intint,而這個結果比較的&t一些地址:(c.Foo<int) > &t

真正的解決方案不過是省略函數調用的顯式模板參數,只是做:

c.Foo(&t); 

這是正確的,即使在情況下這種C具有非模板成員功能Foo(int)。通常,儘可能少的假設編寫模板代碼(但不能少)。

4

Foo()是依賴模板的名稱,所以你需要把template在調用的前面:

template<class C> 
void D<C>::Bar() 
{ 
    int t = 0; 
    c.template Foo(&t); 
} 
+0

thanks.it的工作。 – nsa 2012-04-17 07:44:02

+0

你也可以省略'',導致'c.Foo(&t)'。這應該也是一樣。 – evnu 2012-04-17 07:44:56

+0

@evnu是的,我遺漏了''(正如我在回答中所做的那樣),否則不要留下'template'(就像你在評論中所做的那樣)。 – 2012-04-17 07:46:01