C++模板问题

问题描述:

我有有一个模板,通过其他用途类:C++模板问题

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

和我有另一类方法得到的所有类型的这些类的这些论据,并希望将指针存储在一个阵列。这个类不想访问类的特定(tempalted)部分,只有普通的属性/方法。

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. 
    } 
} 

这里是错误的模板缺少

我怎样才能解决这个参数列表?

最简单的方法是使该函数模板,以及:

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

注意,也许应该是const MyClass<t>&,因为你并不需要修改它。


您的新代码没有意义。没有这样的作为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 
    } 
}; 

那么你可以参考此基础上,当你调用虚函数,它将动态调度:

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 
    } 
}; 
+0

正如编译器告诉你的,你必须**将一个模板参数传递给'MyClass'。 – 2011-04-10 20:23:02

+0

对不起,这是不正确的,因为另一个类方法需要访问MyClass属性,这是我的错误,我没有这么说。我会在第二个 – 2011-04-10 20:23:38

+0

更新我的q谢谢。非常好的答案 – 2011-04-10 20:43:51

所以,除非你吧功能是类的方法,如果你想你不能合法使用这样的

+0

良好的观察,但我认为我们可以认为这是一个错字。 :) – GManNickG 2011-04-10 20:19:03

+0

这不是导致错误消息的原因。 – 2011-04-10 20:21:57

你们班文本变量是私有创建一个“多模板”数组,你最好使用非模板cla ss作为模板类的基类。或者你可以创建一个模板数组并存储任何对象。

如何把一个共同的基类。

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) { 
     /* ... */ 
    } 
}; 
+0

没有看到你添加了这个,并不意味着踩在你的脚趾上。 – GManNickG 2011-04-10 20:37:37

+1

@GMan,没关系。我没有受伤或什么。干杯:) – 2011-04-10 20:38:40

+0

感谢您的回答。我向你提出了这个很好的答案,但我更了解GMAN的答案。 – 2011-04-10 20:45:52