错误:变量或字段' print_array'宣布无效

时间:2014-04-30 18:06:17

标签: c++

我的编译器在以下代码段中的函数声明行中抛出错误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 << ", ";
}

1 个答案:

答案 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,则会导致编译时错误。