C++ VS2010编译器报错:未专用化的类模板不能用模板变量

#include<vector>typedefintID_;template<constID_id>classC{public:voidsay(){};}typedefs... #include<vector>
typedef int ID_;
template<const ID_ id>
class C
{
public:
void say(){};

}
typedef std::vector<C> CVec;//报错
typedef std::vector<C<ID_>> CVec;//报错
typedef std::vector<C<int>> CVec;//报错
int main()
{
CVec vec;

return 0;

}

// 想请以上的typedef语句该怎么写。。。
展开
 我来答
leesunshine007
推荐于2016-07-24 · TA获得超过1172个赞
知道小有建树答主
回答量:701
采纳率:0%
帮助的人:434万
展开全部

呃, 好多错误...

  1. const ID_ id 中的 const 会被编译器忽略掉, 可以不写(这个不算错误).

  2. 这是一个最基本的Error: 类定义 后面 要有  ;  结尾. 

  3. ID_ 既然是 int 的 alias, 那 类C 就是一个 非类型实参的类模板. 也就是说, C<> 的 <> 中应该是个 int的数字, 不能是 int 或者  ID_, 或者 其它类型.

  4. 对于 C++98 C++03 而言, vector<C<5> > 中最后面的 两个 大于号之间  必须要有至少一个空格. 这是语法规定.  除非你的编译器支持 C++11, 而且你在编译的时候 指定了编译选项 


    -std=c++14

    或者

    -std=c++11


最后, 一个修改后的版本:

#include<vector>
typedef int ID_;
template <ID_ id>
class C
{
    public:
        void say() {};
};
//typedef std::vector<C> CVec;//报错
//typedef std::vector<C<ID_>> CVec;//报错
//typedef std::vector<C<int>> CVec;//报错
typedef std::vector<C<1> > CVec;       // 注意: 这三个是不同的类型
typedef std::vector<C<2> > CVec;       // 注意: 这三个是不同的类型
typedef std::vector<C<999> > CVec;     // 注意: 这三个是不同的类型
int main()
{
    CVec vec;
    return 0;
}

 最最后, 欢迎交流. :)

追问
哇遇到大牛了。
那请问"非类型实参的类模板“有什么用呢?
追答
template <typename T, size_t N>
class MyArray
{
    private:
        T arr[N];          // N: 这里不是可以让用户指定 建一个多大的数组吗, 这就是它的作用.
};


MyArray<int, 10> intArr10;
MyArray<double, 100> doubleArr100;

c++设计的多优雅.

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式