2017-05-27 19 views
0

如何在模板函数或类中实例化一个包含类型的容器变量?如何在模板函数或类中实例化一个包含类型的容器变量?

我说对dependent scope; need typename in front;

推荐类型名称但还是没能使其发挥作用。

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

using namespace std; 

template<class T> 
void crazy_func_byvalue(T data){ 
    typename decltype(data)::value_type var; //typename added here 
    cout<< typeid(var).name(); 
    cout<<endl; 
    return; 
} 

template<class T> 
void crazy_func_byaddress(T& data){ 
    typename decltype(data)::value_type var; 
    cout<< typeid(var).name(); 
    cout<<endl; 
    return; 
} 

class test{ 
}; 

int main(){ 
    std::array<double,12> var1={1593,-88517,14301,3200,6,-15099,3200,5881,-2593,11,57361,-92990}; 
    decltype(var1)::value_type x; 
    std::vector<test> var2; 
    crazy_func_byvalue(var1); 
    crazy_func_byvalue(var2); 
    crazy_func_byaddress(var1); //error: 'std::array<double, 12ul>&' is not a class, struct, or union type 
    crazy_func_byaddress(var2); //error: 'std::vector<test>&' is not a class, struct, or union type 

    //cout<<"It is working here"; 
    return 0; 
} 

回答

1

您必须删除引用(与std::remove_reference

template<class T> 
void crazy_func_byaddress(T& data){ 
    typename std::remove_reference<decltype(data)>::type::value_type var; 
    cout<< typeid(var).name(); 
    cout<<endl; 
    return; 
} 
+0

谢谢。它的工作,我试图做同样的事情,但无法找出确切的方式来做到这一点。 –

+0

@KinanAlSarmini - 明显;但OP向我们展示了两个不同的函数,其中使用'decltype()';第一个工作,第二个不工作。他可以在两者中使用'T :: value_type',但是很重要(恕我直言),以显示如何在引用变量中使用'decltype'。 – max66

相关问题