我想知道爲什麼此代碼不能編譯,給人的錯誤:不完全類型的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