2015-06-02 31 views
1

我想定義一個函數foo,它接收數據,可能操縱基礎類變量,並返回int。但是,當我嘗試創建一個單獨的函數並使用foo對象向量時,編譯器無法推導出模板參數。下面說明了什麼我已經試過:傳遞派生的模板類的向量

#include <vector> 

template <typename T> 
class Base { 
public: 
    virtual int foo(const T& x) const = 0; 
}; 

template <typename T> 
class Derived : public Base<std::vector<T> > { // specialize for vector data 
public: 
    virtual int foo(const std::vector<T>& x) const { return 0;} 
}; 

template <typename T> 
int bar(const T& x, const std::vector< Base<T> >& y) { 
    if(y.size() > 0) 
    return y[0].foo(x); 
} 

int main(int argc, char** argv) { 
    std::vector<double> x; 
    std::vector< Derived<double> > y; 
    bar(x, y); 
} 

這無法找到匹配功能bar,與注意事項:如果答案

main.cc:16:5: note: template argument deduction/substitution failed: 
main.cc:24:11: note: mismatched types ‘Base<T>’ and ‘Derived<double>’ 

main.cc:24:11: note: ‘std::vector<Derived<double> >’ is not derived \ 
from ‘const std::vector<Base<T> >’ 

原諒我位於已發佈的線程中;我讀過很多看似相關的數字,但據我所知,並沒有解決這個問題。

回答

4

首先請注意,std::vector<Base<T> >std::vector<Derived<T> >是不同的類型,即使Base<std::vector<T>>Derived<T>的基數。模板類型扣除中不會發生類型轉換。因此T不能通過將您傳遞給barstd::vector<Derived<double>>類型的第二個參數ystd::vector<Base<T>>進行匹配來推斷。

接下來,假設我們做 「正確」 類型的y

std::vector< Base<double> > y; 

這樣你就可以將它傳遞給bar。現在原則上,我們可以通過匹配std::vector<Base<T>>類型的bar中的第二個參數與ystd::vector< Base<double> >類型來推導出T。所以T推導爲double,但是不要忘記,x,其中傳遞的第一個參數bar,具有類型vector<double>,所以從x我們會演繹出Tvector<double>,這當然是與doubley推斷不一致。因此,類型扣除失敗。

Here是複製您的問題的簡化示例。

+0

當然,但在我的情況'x'和'y'是一致的。編譯器會捕獲你發佈的內容,不是嗎? – glinka

+0

@glinka看到我更新的編輯。 – vsoftco

+0

沒錯,但我的代碼中的問題似乎並不是不一致的模板參數之一,但有些無法識別「衍生」是'Base >'。我同意代碼容易出現你突出顯示的錯誤。 – glinka