我的编译器在以下代码段中的函数声明行中抛出错误error: variable or field 'print_array' declared void
。
#include <iostream>
template <typename T>
struct arrWrapper
{
T* firstPtr;
size_t length;
};
template <typename T>
void print_array(arrWrapper W)
{
for (T* i(W.firstPtr), j(W.firstPtr + W.length); i != j; i++)
std::cout << *i << ", ";
}
int main()
{
int myArray[] = {1, 2, 69, 144};
arrWrapper myWrapper = {myArray, sizeof(myArray)/sizeof(int)};
print_array(myWrapper)
return 0;
}
任何人都可以了解我为什么会收到这个错误吗?
我有另一个问题:有谁知道如何使用std::cout
检查变量是否可以打印到控制台?
换句话说,我想将我的功能改为:
template <typename T>
void print_array(arrWrapper W)
{
/* check whether I can cout an element of type T, and if so,
terminate the function here
*/
for (T* i(W.firstPtr), j(W.firstPtr + W.length); i != j; i++)
std::cout << *i << ", ";
}
答案 0 :(得分:2)
你需要
template <typename T>
void print_array(arrWrapper<T> W)
// ^^^ provide a template parameter
同样适用于
arrWrapper<int> myWrapper = //...
稍后在您的代码中。
对于第二个问题:您可以使用C ++ 11的类型特征禁用该函数(或使用Boost版本用于预C ++ 11):
#include <type_traits>
template <typename T>
typename std::enable_if<sizeof(std::cout<<std::declval<T>())!=0>::type
print_array(arrWrapper<T> W)
{
for (T* i(W.firstPtr), j(W.firstPtr + W.length); i != j; i++)
std::cout << *i << ", ";
}
如果无法打印T
,则会导致编译时错误。