为什么这个模板不能编译?

时间:2013-09-11 12:05:00

标签: c++ templates generic-programming

我有一个非常简单的模板,它是一个T的数组容器。我收到语法错误:

container.h(7):错误C2143:语法错误:缺少';'在'&'之前。我已经尝试删除那里的声明,但然后错误只是跳过定义。非常感谢任何帮助。

编辑:现在我修复了使用命名空间的东西,但弹出了另一个错误: container.h(8):error C2975:'Container':'unnamed-parameter'的模板参数无效,是预期的编译时常量表达式

#include <typeinfo.h>
#include <assert.h>
#include <iostream>
#pragma once

using namespace std; 
template <typename T, int> class Container;
template <typename T, int> ostream& operator<< <>(ostream &, const Container<T,int> &);

template<class T , int capacity=0> class Container
{
    //using namespace std;
private:
    T inside[capacity];
public:
    Container()
    {

    }

    ~Container(void)
    {
    }

    void set(const T &tType, int index)
    {
        assert(index>=0 && index<= capacity);
        inside[index] = tType;
    }

    T& operator[](int index)
    {
        assert(index>=0 && index<= capacity);
        return inside[index];
    }

    friend ostream& operator<< <>(ostream& out, const Container<T,int> c);
    {
        for(int i=0;i<sizeof(inside)/sizeof(T);i++)
            out<<c.inside[i]<< "\t";
        return out;
    }
};

2 个答案:

答案 0 :(得分:4)

你可能想要:

template <typename T, int N>
ostream& operator<<(ostream &, const Container<T,N> &);
//                                               ^ here you need N, not int!

或者,因为您实际上不需要前向声明,所以您可以在您的课程中使用此实现:

friend ostream& operator<<(ostream & out, const Container<T,capacity>& c)
{
    for(int i=0;i<capacity;++i)
        out<<c.inside[i]<< "\t";
    return out;
}

答案 1 :(得分:0)

你想要这样的东西:

template <typename T, int N>
friend ostream& operator<<(ostream & out, const Container<T,N>& c) {
    for(int i=0;i<sizeof(inside)/sizeof(T);i++)
        out<<c.inside[i]<< "\t";
    return out;
}