2011-12-08 124 views
0

如何讓我的類在不明確引用它的情況下推斷參數的內部類型?看看下面的小例子:嵌套STL模板的類型

#include <vector> 

template <class T> 
class foo { 
public: 
    foo(std::vector<T> &x) : 
    _x(x) { 
     T dummy = x.front(); // Trying to trick the compiler here 
    } 
private: 
    std::vector<T> _x; 
}; 

int main() { 
    std::vector<int> a; 
    foo<int> b(a); // This works 
    foo c(a);  // This fails 
    return 0; 
} 

我看到foo預計它的參數是一個vector<int>,但它讓我創造T==[int]類型的對象,所以它看起來像它知道內部類型是什麼!永遠不要忘記爲空時dummy的賦值失敗......我如何引用嵌套的內部類型?

+0

我不明白的問題。 「嵌套內部類型」是什麼意思?嵌套模板在哪裏?你想在哪裏推斷類型? 'foo c(a)'這一行或其他地方? – jalf

+0

@jalf對不起,如果措辭不清楚,或者如果我混淆了我的條款(請糾正我)。我想使行'foo c(a)'編譯,而現在它失敗了,因爲'foo'沒有類型。 – Hooked

回答

3
foo c(a);  // This fails 

出於顯而易見的原因。 foo是一個類模板,不能在沒有命名模板參數的情況下實例化它的一個對象。
這不像函數模板,其中可以通過函數參數推斷模板參數。 foo在這種情況下命名類型(或應該),而不是構造函數。

在C++ 11,你可以這樣做:

template<class T> 
foo<T> make_foo(std::vector<T> const& x){ 
    return foo<T>(x); 
} 

// in main 
auto f = make_foo(a); 
+0

沿着這些線,那麼你可以包裝在一個函數的構造,只是使用新的'自動'返回類型?這是標準做法嗎? – Hooked

+0

@Hooked:當然,你可以在C++ 11中完成。不過,我不確定它是否有用。但你可以做到,沒問題。 – Xeo

+0

其實你不能*返回一個'auto',因爲它是一個類型的佔位符。 'auto'的類型將在初始化時被推斷出來,所以它不能被用作返回類型或參數。 – AJG85