C++类模板问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++类模板问题相关的知识,希望对你有一定的参考价值。

#include<iostream>
template<class T,int i>class MyStack
public:
T buffer[i];
T getData(int j);

;

error C2973: 'MyStack' : invalid template argument 'i'

看了一些相关问题的解答,说是template<>中的第二个参数不能是int型,但是老师给的模板例子是可以的,说这叫既使用类型参数又使用普通参数的类模板示例,请问到底错在哪里啊?

参考技术A 这个不是模板本身的错误,而是使用的问题。模板的参数可以为非类型形参,就像那个int i。这种参数有限制:使用时必须用常量表达式。
比如main里面这么写:
MyStack<int,5> ms; //这样可以,5是常量
int n=7;
MyStack<int,n> ms2; //这里就出错了,编译器会报错:第二个参数非法、n不能出现在一个常量表达式中等等。
参考技术B 你这是运用了模板元的思想,当然C++是支持。
你得确认你的翻译器的版本,VC6应该是不支持,得用支持C++ 03标准的翻译器才支持这个语法特性。追问

饿,我的确是VC6的,那要换翻译器要把整个VC6都换了吗?

追答

VC6太老了,重新装个VS2010或VS2012吧。

本回答被提问者采纳
参考技术C 错误在这里T buffer[i];
buffer数组的定义必须是一个固定的数值,而你这里使用了变量来定义它的长度。
这里可以考虑使用指针,在构造函数进行内存分配来实现。
参考技术D 我认为这个例子没有错,不同编译器对模板的支持不一样,也许是你用的编译器有点弱 第5个回答  2013-02-28   关键看你怎么用这个模板的?
MyStack<long, 5> my_statck; // OK

...
int n=5;
MyStack<long, n> my_stack; // Wrong

c++模板问题

【中文标题】c++模板问题【英文标题】:c++ template problem 【发布时间】:2011-04-10 20:15:16 【问题描述】:

我有一个具有其他用途的模板的类:

template<class t>
class MyClass 
    public: //of course public...
    t foo;
    std::string text;

我有另一个类,该类通过参数获取所有这些类,并希望将指针存储在数组中。该类不想只访问类的特定(模板化)部分,而是访问公共属性/方法。

class Container 
    public: //of course public...
    MyClass* array; //this is allocated with some magic.
    void bar(MyClass& m) 
      and want to store the class in a MyClass* array.
    

这是模板参数列表丢失

的错误

我该如何解决这个问题?

【问题讨论】:

【参考方案1】:

最简单的方法是将该函数也设为模板:

template <class t>
void bar(MyClass<t>& m) 
    // ...

请注意,这可能应该是const MyClass&lt;t&gt;&amp;,因为您不需要修改它。


您的新代码毫无意义。不存在MyClass 类型的对象,因为MyClass 是一个模板。如果您想对这些类进行操作而不考虑它们的模板参数,那么您需要将非模板部分分解为基类:

class MyClassBase

public:
    // polymorphic base classes should always have virtual destructors
    ~MyClassBase() 

    virtual void some_function() = 0;
;

template <typename T>
class MyClass : public MyClassBase

public:
    // implement abstract functions
    void some_function()
    
        // template argument T is available here
    
;

然后你可以引用那个base,当你调用一个虚函数时它会动态调度:

class Container

public:
    // no magic: use a std::vector for dynamic arrays
    std::vector<MyClassBase*> array; // not by value! avoid slicing

    void bar(MyClassBase& m)
    
        array.push_back(&m);
    

    void baz()
    
        array[0]->some_function(); // for example
    
;

【讨论】:

编译器告诉您,您必须将模板参数传递给MyClass 抱歉,这并不正确,因为另一个类方法需要访问 MyClass 属性,这是我的错误,我没有这么说。我会在一秒钟内更新我的 q【参考方案2】:

放置一个通用的基类怎么样。

class MyClassCommon 
protected:
    ~MyClassCommon()  

public:
    std::string text;
;

template<class t>
class MyClass : public MyClassCommon 
public: // of course public...
    t foo;
;

class Container 
public: // of course public...
    MyClassCommon* array; // this is allocated with some magic.
    void bar(MyClassCommon& m) 
        /* ... */
    
;

【讨论】:

没看到你加了这个,不是故意踩脚的。 也感谢您的回答。我为这个不错的答案投票赞成你,但我更了解 GMan 的答案。【参考方案3】:

如果要创建“多模板”数组,最好使用非模板类作为模板类的基类。或者你可以制作一个模板数组并在其中存储任何对象。

【讨论】:

【参考方案4】:

你的类中的文本变量是私有的,所以除非你的 bar 函数是类的方法,否则你不能像那样合法地使用它

【讨论】:

很好的观察,但我认为我们可以假设这是一个错字。 :)

以上是关于C++类模板问题的主要内容,如果未能解决你的问题,请参考以下文章

C++模板类和类模板

如何编写一个接受每个类和类模板的 C++ 模板?

C++模板(函数模板/类模板)

C++模板(函数模板/类模板)

C++调用类模板的函数模板

C++中模板类与模板方法的使用