2010-01-24 10 views
5

मैं कोड के इस बिट के साथ एक समस्या है: जब मैं बदलसमान टेम्पलेट फ़ंक्शन के संदर्भ में बूस्ट :: multi_array और std :: वेक्टर की पंक्ति कैसे पारित करें?

boost_multi_array.cpp: In function 'int main()': 
boost_multi_array.cpp:26: error: invalid initialization of non-const reference of type 'boost::detail::multi_array::sub_array<double, 1u>&' from a temporary of type 'boost::detail::multi_array::sub_array<double, 1u>' 
boost_multi_array.cpp:7: error: in passing argument 1 of 'void foo(Vec&, size_t) [with Vec = boost::detail::multi_array::sub_array<double, 1u>]' 

यह रूप में बढ़ावा के लिए उम्मीद से काम करता है :: multi_array:

#include <boost/multi_array.hpp> 
#include <boost/array.hpp> 
#include <vector> 
#include <iostream> 

template <typename Vec> 
void foo(Vec& x, size_t N) 
{ 
    for (size_t i = 0; i < N; ++i) { 
     x[i] = i; 
    } 
} 

int main() 
{ 
    std::vector<double> v1(10); 
    foo(v1, 5); 
    std::cout << v1[4] << std::endl; 


    boost::multi_array<double, 2> m1; 
    boost::array<double, 2> shape; 
    shape[0] = 10; 
    shape[1] = 10; 
    m1.resize(shape); 
    foo(m1[0], 5); 
    std::cout << m1[0][4] << std::endl; 
    return 0; 
} 

जीसीसी के साथ संकलित करने के लिए कोशिश कर रहा है, मैं त्रुटि मिलती है foo से Vec& से Vec तक फ़ंक्शन foo के पहले तर्क का प्रकार, लेकिन फिर std :: वेक्टर मान द्वारा पारित किया गया है, जो मैं नहीं चाहता हूं। मैं दो टेम्पलेट्स लिखने के बिना अपना लक्ष्य कैसे प्राप्त कर सकता हूं?

उत्तर

1

समस्या यह है कि NumDims> 1 के लिए, operator[] प्रकार template subarray<NumDims-1>::type की एक अस्थायी ऑब्जेक्ट है।

ए (इतना अच्छा नहीं) काम के आसपास निम्नलिखित की तरह कुछ होगा:

typedef boost::multi_array<double, 2> MA; 
MA m1; 
MA::reference ref = m1[0]; 
foo(ref, 5); // ref is no temporary now 

एक वैकल्पिक अपने कार्यान्वयन लपेट और बहु ​​सरणी मामले के लिए एक अधिभार प्रदान करने के लिए किया जाएगा .... उदाहरण के लिए:

(ध्यान दें: मैं देख रहा हूँ नहीं था कैसे अधिभार boost::multi_array<T,N>::reference के साथ काम करने के लिए, इस detail:: संस्करण के साथ उत्पादक उपयोग में डाल दिया नहीं करते कृपया;)

template<class T> 
void foo_impl(T x, size_t N) { 
    for (size_t i = 0; i < N; ++i) { 
     x[i] = i; 
    } 
} 

template<class T> 
void foo(T& t, size_t n) { 
    foo_impl<T&>(t, n); 
} 

template<typename T, size_t size> 
void foo(boost::detail::multi_array::sub_array<T, size> r, size_t n) { 
    foo_impl(r, n); 
} 
+0

क्या यह बूस्ट :: enable_if_c और boost :: गुणों का उपयोग करके खूबसूरती से हल किया जा सकता है? –

+0

एमए :: संदर्भ रेफरी = एम 1 [0] लाइन निश्चित रूप से संक्षेप में संक्षिप्त नहीं है, लेकिन यह std :: वेक्टर मामले के लिए रनटाइम पर महत्वपूर्ण ओवरहेड जोड़ने की आवश्यकता नहीं है। मैंने हाल ही में एक ही समस्या का सामना किया: http://old.nabble.com/-multiarray--problems-passing-views-by-reference-td27039405.html –

+0

@quant_dev: यह भी है कि 'बूस्ट का उपयोग क्यों करें :: multi_array :: संदर्भ' सीधे काम नहीं करता है, मेरे पास आगे की जांच करने का समय नहीं है। –

संबंधित मुद्दे