【发布时间】:2014-08-02 23:20:47
【问题描述】:
我正在编写一个计算多维向量元素的函数
template<class T>
int real_size(const std::vector<T>& vec)
{
int size=0;
for(const auto& v : vec)
{
if(std::is_integral<T>::value ||
std::is_floating_point<T>::value){
size+=1;
}
else{
size +=real_size(v);
}
}
return size;
}
int main()
{
std::vector<std::vector<int>> a(10);
a[0]=std::vector<int>(10);
std::cout<<real_size(a);
}
这给了我这些错误:
error: no matching function for call to 'real_size(const int&)'
size +=real_size(v);
^
该代码似乎很好,错误无关紧要...... else 语句永远不应成为 size +=real_size(int);,因为我正在使用 std::is_integer 检查模板参数的类型。
但似乎编译器在编译时无法理解它!是编译器错误还是我犯了错误?
*我使用的是 gcc 4.8.1。 g++ -std=c++11 *
【问题讨论】:
-
else子句中的代码不是有条件编译的。 -
仅供参考:
std::is_arithmetic -
@xyz 不,不会的。您将
std::vector<T>作为输入参数传递,将如何在递归调用中传递 T? -
@FabioFracassi,我仍然认为
static_if使这样的代码比标签调度、SFINAE 或其他一些 TMP 方法更容易理解:/ 我确实看到它很容易被滥用,但如果使用得当,它可以使代码更短,并将内容保存在一个地方。