通过引用传递数组

时间:2015-05-11 14:10:25

标签: c++ multithreading templates c++11 reference

我有一个数组需要传递给多个线程来处理。在编译时知道数组大小。 这是对直接调用函数的基本要素的减少,而不是通过线程:

#include <thread>

template <class TYPE>
void function(TYPE& data, std::size_t row, std::size_t column){
    data[row-1][column-1]=2;
}

int main(){
    const int column(5),row(2);
    std::array<std::array<int, column>, row> arr;
    function(arr, row, column);
    return data[row-1][column-1];
}

代码返回2,如预期的那样。 如果我通过

调用该功能
    std::thread worker(function<std::array<std::array<int,column>,row>>, arr, row, column);

我收到以下编译错误:

g++ Testo.cpp -o Testo -std=c++11 -lpthread
In file included from /usr/include/c++/4.8/thread:39:0,
                 from Testo.cpp:2:
/usr/include/c++/4.8/functional: In instantiation of ‘struct std::_Bind_simple<void (*(std::array<std::array<int, 5ul>, 4ul>, int, int))(std::array<std::array<int, 5ul>, 4ul>&, long unsigned int, long unsigned int)>’:
/usr/include/c++/4.8/thread:137:47:   required from ‘std::thread::thread(_Callable&&, _Args&& ...) [with _Callable = void (&)(std::array<std::array<int, 5ul>, 4ul>&, long unsigned int, long unsigned int); _Args = {std::array<std::array<int, 5ul>, 4ul>&, const int&, const int&}]’
Testo.cpp:13:82:   required from here
/usr/include/c++/4.8/functional:1697:61: error: no type named ‘type’ in ‘class std::result_of<void (*(std::array<std::array<int, 5ul>, 4ul>, int, int))(std::array<std::array<int, 5ul>, 4ul>&, long unsigned int, long unsigned int)>’
       typedef typename result_of<_Callable(_Args...)>::type result_type;
                                                             ^
/usr/include/c++/4.8/functional:1727:9: error: no type named ‘type’ in ‘class std::result_of<void (*(std::array<std::array<int, 5ul>, 4ul>, int, int))(std::array<std::array<int, 5ul>, 4ul>&, long unsigned int, long unsigned int)>’
         _M_invoke(_Index_tuple<_Indices...>)
         ^

我可以将模板更改为

template <class TYPE>
void function(TYPE data, std::size_t row, std::size_t column){
    data[row-1][column-1]=2;
}

并且编译器不再抱怨,但是main然后返回0,因为数组不再通过引用传递。 线程调用正确模板以通过引用传递数组的适当的第一个参数是什么,就像在直接调用函数时一样工作?

1 个答案:

答案 0 :(得分:2)

通过引用传递std::ref(arr)