2015-10-12 78 views
0

以下代碼不能在最新的Microsoft Visual Studio上編譯。有人能告訴我我在做什麼錯嗎?使用C++使用:我在這裏做錯了什麼?

#include <iostream> 
#include <iomanip> 
#include <array> 

template <typename T, std::size_t M, std::size_t N> 
using Matrix = std::array<T, M * N>; 

template <typename T, std::size_t M, std::size_t N> 
std::ostream &operator<<(std::ostream &os, const Matrix<T, M, N> &matrix) 
{ 
    for (auto i = 0; i < M; ++i) 
    { 
     for (auto j = 0; j < N; ++j) 
     { 
      os << std::setw(5) << matrix[i * N + j]; 
     } 

     os << std::endl; 
    } 

    return os; 
} 

int main(int argc, const char * const argv[]) 
{ 
    Matrix<float, 2, 3> matrix{ 
     1.1f, 1.2f, 1.3f, 
     2.1f, 2.2f, 2.3f 
    }; 

    std::cout << matrix << std::endl; 

    return 0; 
} 

以下是編譯器錯誤的快照:

1>main.cpp(30): error C2679: binary '<<': no operator found which takes a right-hand operand of type 'std::array<T,6>' (or there is no acceptable conversion) 
1>   with 
1>   [ 
1>    T=float 
1>   ] 

編輯: 下面的代碼工作,但:

#include <iostream> 
#include <iomanip> 
#include <array> 

template <typename T, std::size_t M, std::size_t N> 
using Matrix = std::array<std::array<T, N>, M>; 

template <typename T, std::size_t M, std::size_t N> 
std::ostream &operator<<(std::ostream &os, const Matrix<T, M, N> &matrix) 
{ 
    for (auto row : matrix) 
    { 
     for (auto element : row) 
     { 
      os << std::setw(5) << element; 
     } 

     os << std::endl; 
    } 

    return os; 
} 

int main(int argc, const char * const argv[]) 
{ 
    Matrix<float, 2, 3> matrix{ 
     1.1f, 1.2f, 1.3f, 
     2.1f, 2.2f, 2.3f 
    }; 

    std::cout << matrix << std::endl; 

    return 0; 
} 
+4

隨着'N * M'通過'的std :: array'間接:

所以,你只需要使用聚合包括實際數據作爲一個字段,如),獨立推導'N'和'M'是不可能的。請注意,類型別名的實例化與它們引用的類型相同,也就是說,第二個'operator <<'參數等同於'const std :: array &matrix' – dyp

+1

@dyp,可能您應該讓它成爲答案 – Lol4t0

+0

謝謝,我現在明白了! – 0ca6ra

回答

2

記@ DYP的評論軸承你必須做什麼這裏是創建的新類型而不是別名那將有2個獨立的pa公羊。在`運營商<<'(的模板參數

template <typename T, std::size_t M, std::size_t N> 
class Matrix 
{ 
private: 
    std::array<T, M * N> _data; 
    template <typename T1, std::size_t M1, std::size_t N1> friend std::ostream &operator<<(std::ostream &os, const Matrix<T1, M1, N1> &matrix); 
public: 
    template <typename...Args> 
    Matrix(Args... args): 
     _data{{std::forward<Args>(args)...}} 
    {} 
}; 
相關問題