Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我可以使用类级别的typedef作为基类的模板参数吗?_C++_Templates_Inheritance_Typedef - Fatal编程技术网

C++ 我可以使用类级别的typedef作为基类的模板参数吗?

C++ 我可以使用类级别的typedef作为基类的模板参数吗?,c++,templates,inheritance,typedef,C++,Templates,Inheritance,Typedef,假设一个模板化基类: template<typename T>class BaseClass; template <typename T> class BaseClass { protected: typedef T LocalType; // whatever else }; class ChildClass : public BaseClass<MyVeryVeryVeryComplicatedType> { // Local

假设一个模板化基类:

template<typename T>class BaseClass;
template <typename T> class BaseClass {
protected:
    typedef T LocalType;

    // whatever else
};

class ChildClass : public BaseClass<MyVeryVeryVeryComplicatedType> {
    // LocalType is usable here, and aliases MyVeryVeryVeryComplicatedType
};
当然,现在我还不能使用
LocalType
作为
BaseClass
的模板参数,并且必须编写两次复杂的定义(
myveryverydompleddetype
)。(我想标题问题的答案是‘否’。)

问题:有没有办法只定义一次,但仍然只在类内部定义(或者以类似的方式限制
LocalType
的范围)

注意:我考虑过使用宏,但注意到结果与类定义之前的
typedef
相同(甚至更糟)


编辑:澄清一下:我有一个基类,因为我想有几个不同的子类,它们共享一些功能。共享部分只需要知道存在某种类型的
T
。由于子类中使用的类型的细节与共享功能无关,我认为基类不应该知道这些细节(实际上,我必须在基类中放入大量的
#include
语句,以便能够为所有子类定义
typedef
s)。每个子类都有一个非常不同的
myveryverycomplicatedtype

否。请将
typedef
放在封闭的命名空间中


无论如何,这是最有意义的,因为您正在该名称空间的两种类型(
ChildClass
BaseClass
)中使用它。

只需使用一个小的辅助名称空间:

namespace ChildClassNamespace {
    typedef MyVeryVeryComplicatedType LocalType;
    class ChildClass : public BaseClass<LocalType> { /* ... */ };
}
using ChildClassNamespace::ChildClass;
namespace子类名称空间{
typedef myveryveryverydtype LocalType;
类ChildClass:公共基类{/*…*/};
}
使用ChildClassNamespace::ChildClass;

您可以在基类中定义它:

template<typename T>class BaseClass;
template <typename T> class BaseClass {
protected:
    typedef T LocalType;

    // whatever else
};

class ChildClass : public BaseClass<MyVeryVeryVeryComplicatedType> {
    // LocalType is usable here, and aliases MyVeryVeryVeryComplicatedType
};
模板类基类{
受保护的:
typedef T LocalType;
//还有别的吗
};
类ChildClass:公共基类{
//LocalType在此处可用,别名为MyVeryVeryComplicatedType
};

我认为没有办法在
类中定义
typedef
,然后在没有类限定的情况下在外部解决它。基类应该相当抽象,并且不知道复杂的实现特定类型。否则,将基类模板化也可能没有太大意义。很抱歉没有明确指出。@user2296653:它不需要知道关于复杂类型的任何信息。它只需要知道它的模板参数,由派生类提供。@user2296653:请参阅我的更新,它清楚地表明,
T
指的是模板参数,而不是复杂的类型名。啊,我以前确实没有正确地理解它。谢谢你的编辑。很好的解决方案。不,我只在基类中以抽象的方式使用T类型。MyVeryVeryVeryCompoundedType的详细信息仅由子类使用。@user2296653:在基类中使用它已经足够了,否则就不需要将其作为模板参数传递下去。这当然是一种方法,但并不理想,因为在您的解决方案中,无论何时使用该类,我都必须编写using语句,或者将其放在ChildClass的头文件中,这将与类外的typedef具有相同的效果。我不想在使用类时编写using语句,因为typedef只与私有类特性相关。(很抱歉没有指出这一点。)