C ++无法使用typedef创建模板或者键入模板化模板。我知道如果我继承并使我的班级成为模板,它将会起作用。
示例:
// Illegal
template <class T>
typedef MyVectorType vector<T>;
//Valid, but advantageous?
template <class T>
class MyVectorType : public vector<T> { };
这样做有利于我可以“伪造”一个typedef或者有更好的方法来做到这一点吗?
答案 0 :(得分:13)
C ++ 0x将使用using
关键字添加模板typedef。
您的解决方案声明了一种新类型,而不是类型“别名”,例如您无法使用MyVectorType &
初始化vector<T>
(引用)。这对您来说可能不是问题,但如果是,但您不想在代码中引用向量,则可以执行以下操作:
template <typename T>
class MyVectorType {
public:
typedef std::vector<T> type;
};
答案 1 :(得分:10)
继承不是你想要的。模仿模板化typedef的更惯用的方法是:
template <typename T> struct MyVectorType {
typedef std::vector<T> t;
};
请参阅类似的typedef:
MyVectorType<T>::t;
答案 2 :(得分:1)
C ++无法使用typedef创建模板或者键入模板化的类。
这取决于typedef
的含义:std::vector<size_t>
是合法的 - 即使size_t
是typedef - std::string
是typedef
std::basic_string<char>
。
答案 3 :(得分:0)
您应该使用什么取决于它的表现方式(例如过载分辨率):
如果您希望它是一种新的独特类型
class Foo : public Whatever {};
但是,您现在可以将Foo
的指针或引用传递给接受Whatever
的函数,因此这成为一种混合形式。因此,在这种情况下,请使用private
继承和using Whatever::Foo
或自定义实现来公开所需的方法。
如果您想输入类型同义词
using Foo = Whatever;
前者的优点是可以预先声明一个类,而不是typedef。