运营商LT;<不能使用其朋友的数组成员

时间:2016-06-24 10:19:53

标签: c++ templates iterator typename

我想,如果我做运算符<<的朋友 数据结构(按名称排列);

//Forward Declarations
template<typename S, typename T> 
struct array;

template<typename U, typename V>
ostream& operator<< (ostream& ous, const array<U, V>& t);
那么,我将能够做到这样的事情;在运算符&lt;&lt;

的实现中
//operator<< is a friend of struct array{} already
template<typename T, typename U>
ostream& operator<< (ostream& os, const array<T, U>& var){

    if(var){
        /*Error: 'IT' was not declared in this scope*/

        for(IT it = var.data.begin(); it != var.data.end(); it++){
            /*and i thought i need not redeclare IT before using it
             since operator<< is a friend of array already*/
        }
    }
    else{cout << "empty";}

    return os;
}

现在,这是数组的实现:

/*explicit (full) specialization of array for <type, char>*/
template<>
template<typename Key>
struct array<Key, char>{ 

     //data members
     map<const Key, string> data; 
     typedef map<const Key, string>::iterator IT;

     //member function
     friend ostream& operator<< <>(ostream& ous, const array& t);

     //other stuff/functions
};

最后,当我测试它时,编译器很生气;

void Test(){
     array<int, char> out;
     out[1] = "one";            //Never mind. this has been taken care of
     out[2] = "two";            
     cout << out;               //Error: 'IT' was not declared in this scope
}

问题: 究竟我做错了什么,或者,为什么我不能直接访问和使用 IT(数组中的typedef),即使在我声明了运算符&lt;&lt; (要求IT) 作为数组结构的朋友?

2 个答案:

答案 0 :(得分:0)

for( typename array<T, U>::IT it = var.data.begin(); it != var.data.end(); it++){

并改变

typedef map<const Key, string>::iterator IT;

typedef typename std::map<const Key, string>::const_iterator IT;

这是一个示范性程序,而不是std::map我使用std::array来简化。我认为它可以帮助你。

#include <iostream>
#include <array>

template <typename T, size_t N>
struct A
{
    std::array<T, N> a;

    typedef typename std::array<T, N>::const_iterator IT;
};

template <typename T, size_t N>
std::ostream & operator <<( std::ostream &os, const A<T, N> &a )
{
    for ( typename A<T, N>::IT it = a.a.begin(); it != a.a.end(); ++it ) os << *it << ' ';

    return os;
}

int main() 
{
    A<int, 10> a  = { { { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 } } };

    std::cout << a << std::endl;

    return 0;
}

程序输出

0 1 2 3 4 5 6 7 8 9 

答案 1 :(得分:0)

当您在模板中使用IT时,编译器会在当前范围(操作员模板)中查找名为IT的类型的声明。

这会失败,因为您将类型定义为数组结构的一部分。

因此,要使用IT类型,您需要使用array<T,U>::IT完全限定它。 或者,如果您使用的是C ++ 11,则可以尝试使用auto