2015-11-02 109 views
0

我有以下代碼:返回模板結果

#include <array> 
#include <iostream> 
#include <typeinfo> 
#include <type_traits> 
#include <utility> 

namespace impl 
{ 
    template <typename T> 
    struct Matrix_traits { 

    }; 
} 

template <size_t M, size_t N, typename T> 
class Matrix 
{ 

}; 

template <size_t M, size_t N, typename T> 
struct impl::Matrix_traits<Matrix<M, N, T>> { 
    template <typename U> 
    struct scalar_mult_type 
    { 
     // just for testing 
     using type = std::pair<std::array<T, M>, std::array<T, N>>; 
    }; 
}; 

int main() 
{ 
    Matrix<3, 4, char> m; 

    mult(3, m); 

    return 0; 
} 

當我用下面的函數實現,在那裏我明確指定返回類型:

template <typename T, typename U> 
std::pair<std::array<char, 3>, std::array<char, 4>> mult(const T& lambda, const U& m) 
{ 
    typename impl::Matrix_traits<U>::scalar_mult_type<T>::type result; 
    std::cout << typeid(result).name() << "\tEUREKA!\n"; 
    return result; 
} 

它的工作原理......但這顯然不是我想要的......但是當我試圖變得更加靈活時:

template <typename T, typename U> 
typename impl::Matrix_traits<U>::scalar_mult_type<T>::type mult(const T& lambda, const U& m) 
{ 
    typename impl::Matrix_traits<U>::scalar_mult_type<T>::type result; 
    std::cout << typeid(result).name() << "\tEUREKA!\n"; 
    return result; 
} 

我有「無法辨認模板聲明/定義「錯誤。 這對我來說是一個真正的難題。爲什麼同樣的聲明對局部變量'result'有效,但是作爲返回類型失敗了?

+0

什麼是'結構IMPL :: Matrix_traits <矩陣>'什麼意思? – SergeyA

+0

您的'Matrix_Traits'在一種情況下采用一個模板參數,在另一種情況下爲3。你可以試着解釋一下你想要使用這些特質嗎? –

+0

@SimonKraemer:第二種情況是(部分)專業化。 – Jarod42

回答

0

template丟失,它應該是

template <typename T, typename U> 
typename impl::Matrix_traits<U>::template scalar_mult_type<T>::type 
mult(const T& , const U&) 
{ 
    typename impl::Matrix_traits<U>::template scalar_mult_type<T>::type result; 
    std::cout << typeid(result).name() << "\tEUREKA!\n"; 
    return result; 
} 

Demo

+0

這工作!謝謝! – Mirek

+0

@Mirek:感謝的方式是接受/提出答案。評論主要是要求或補充。 – Jarod42