我想知道为什么此代码不能编译,给人的错误:不完全类型的std :: tuple_size < aveure>嵌套名指定错误:不完全类型...嵌套名指定中使用
我用如果函数与类型不匹配,但甚至无法编译它,则会出现运行时错误。
#include <iostream>
#include <typeinfo>
#include <tuple>
struct aveure{
int que;
};
template<typename T>
void prova(T valor){
int s;
if (typeid(valor) == typeid(aveure)) // Even having if (true)
// would cause the same error
s=valor.que;
else
s = std::tuple_size<T>::value; // ERROR !!! Even when T is a
// struct aveure, not a tuple
std::cout << s;
}
int main() {
aveure qui;
qui.que=2;
prova<aveure>(qui);
return 0;
}
当然,这个错误是可以解决的分裂功能:
#include <iostream>
#include <typeinfo>
#include <tuple>
struct aveure{
int que;
};
template< typename T >
int len(T val){
return(std::tuple_size<T>::value);
}
template<>
int len(aveure quan){
return quan.que;
}
template<typename T>
void prova(T valor){
int s = len(valor);
std::cout << s<<std::endl;
}
int main() {
aveure qui;
qui.que=2;
prova<aveure>(qui); // returns 2
auto first = std::make_tuple (10,'a',"hola");
prova<decltype(first)>(first); // returns 3
return 0;
}
有没有更好的解决办法来解决呢?
谢谢你的回答,巴里。很有用。我发现了两篇很好的文章来补充您关于SFINAE的观点:[link](http://oopscenities.net/2012/04/30/c-sfinae/)和[link](https://debugfailure.wordpress.com/2009/10/06 /理解-SFINAE /)。无论如何,我将继续使用我提出的解决方案,因为在区分普通类型时不需要SFINAE,而不需要这些类型的属性(例如迭代性等)。 – nibrot 2015-01-22 09:48:47