11

C++ 无法从 typedef 或 typedef 模板类中生成模板。我知道如果我继承并使我的类成为模板,它将起作用。

例子:

// Illegal
template <class T>
typedef MyVectorType vector<T>;

//Valid, but advantageous?
template <class T>
class MyVectorType : public vector<T> { };

这样做是有利的,以便我可以“伪造” typedef 还是有更好的方法来做到这一点?

4

4 回答 4

13

C++0x 将使用using关键字添加模板类型定义。

您的解决方案声明了一种新类型,而不是类型“别名”,例如,您不能MyVectorType &使用vector<T>. 这对您来说可能不是问题,但如果是,但您不想在代码中引用向量,您可以这样做:

template <typename T>
class MyVectorType {
public:
  typedef std::vector<T> type;
};
于 2009-01-14T03:07:04.997 回答
10

继承不是你想要的。模拟模板化 typedef 的一种更惯用的方法是:

template <typename T> struct MyVectorType {
    typedef std::vector<T> t;
};

像这样引用typedef:

MyVectorType<T>::t;
于 2009-01-14T03:06:23.423 回答
1

C++ 无法从 typedef 或 typedef 模板类中生成模板。

这取决于你的意思typedef: std::vector<size_t>是合法的——即使size_t是 typedef ——并且std::stringtypedeffor std::basic_string<char>

于 2009-01-14T08:20:35.800 回答
1

您应该使用什么取决于它的行为方式(例如重载解决方案):

  • 如果您希望它成为一种新的独特类型

    class Foo : public Whatever {};
    

    但是,您现在可以将 , 的指针或引用传递Foo给接受 的函数Whatever,因此这变成了混合体。因此,在这种情况下,请使用private继承using Whatever::Foo或自定义实现来公开您想要的方法。

  • 如果你想要一个类型同义词

    using Foo = Whatever;
    

前者的优点是可以预先声明一个类,但不能预先声明一个 typedef。

于 2018-07-31T16:53:17.993 回答