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_C++11_Template Specialization - Fatal编程技术网

C++ 不能将一个类的成员typedef用作模板专用化定义中的模板参数

C++ 不能将一个类的成员typedef用作模板专用化定义中的模板参数,c++,templates,c++11,template-specialization,C++,Templates,C++11,Template Specialization,抱歉,标题太长,而且模棱两可 我一直在尝试从《现代C++设计》这本书中学习到的东西。作为本活动的一部分,我正在尝试实现书中描述的命令模式,并尝试将其迁移到C++11 我现在处于这种状态: 我实现了TypeListGenerator以替换TYPELIST\N(…)以能够使用可变模板: // without variadic templates #define TYPELIST_0() NullType #define TYPELIST_1(T1) TypeList<T1, NullType&

抱歉,标题太长,而且模棱两可

我一直在尝试从《现代C++设计》这本书中学习到的东西。作为本活动的一部分,我正在尝试实现书中描述的命令模式,并尝试将其迁移到C++11

我现在处于这种状态:

我实现了
TypeListGenerator
以替换
TYPELIST\N(…)
以能够使用可变模板:

// without variadic templates
#define TYPELIST_0() NullType
#define TYPELIST_1(T1) TypeList<T1, NullType>
#define TYPELIST_2(T1, T2) TypeList<T1, TYPELIST_1(T2)>
...

// with variadic templates
template <typename Head, typename... Rest> struct TypeListGenerator {
    using result = TypeList<Head, typename TypeListGenerator<Rest...>::result>;
};
template <> struct TypeListGenerator<NullType> {
    using result = NullType;
};
template <typename Last> struct TypeListGenerator<Last> {
    using result = TypeList<Last, NullType>;
};
//不带可变模板
#定义类型列表_0()空类型
#定义类型列表\u 1(T1)类型列表
#定义类型列表\u 2(T1、T2)类型列表
...
//可变模板
模板结构类型列表生成器{
使用结果=类型列表;
};
模板结构类型列表生成器{
使用结果=空类型;
};
模板结构类型列表生成器{
使用结果=类型列表;
};
现在,问题出现在以下代码中:

template <typename R, typename P1>
//class FunctorImpl<R, typename TypeListGenerator<P1>::result> { // <-- #1 - Does not compile
class FunctorImpl<R, TYPELIST_1(P1)> { //<-- #2 - Compiles
    public:
    virtual R operator()(P1) = 0;
    virtual FunctorImpl* clone() const = 0;
    virtual ~FunctorImpl() = 0;
};

template <typename R, typename TL>
class Functor {
    using P1 = typename TypeAtNonStrict<TL, 0, EmptyType>::type;
    using P2 = typename TypeAtNonStrict<TL, 1, EmptyType>::type;
    using P3 = typename TypeAtNonStrict<TL, 2, EmptyType>::type;
    using P4 = typename TypeAtNonStrict<TL, 3, EmptyType>::type;
public:
    Functor() : impl_(nullptr) { }
    R operator()() { return (*impl_)(); }
    R operator()(P1 p1) { return (*impl_)(p1); }
    R operator()(P1 p1, P2 p2) { return (*impl_)(p1, p2); }
    R operator()(P1 p1, P2 p2, P3 p3) { return (*impl_)(p1, p2, p3); }
private:
    FunctorImpl<R, TL>* impl_;
};

int main() {
    Functor<double, typename TypeListGenerator<int>::result> f1;
    double r1 = f1(1);
}
模板

//类functionImpl{/这是一个非推断上下文的例子。下面给出了非推断上下文的非正式解释,通过谷歌搜索可以找到更多信息

简单地说,给定
X
X::Z
,您无法推断
Y

假设
TypeListGenerator::result
int
,而
TypeListGenerator::result
也是
int

您将
int
传递给模板,它是否有机会理解它实际上是
TypeListGenerator::result
而不是
TypeListGenerator::result
?否


但是我用一种独特的方式仔细定义了我的
TypeListGenerator::result
,这样实际上就可以恢复
P1
,你说。没关系。恢复它的过程在一般情况下并不存在,所以语言规则说它没有完成。

注意,你可以使用
std::tuple
std::tuple\u元素
std::get
而不是
TypeList
impl
总是
nullptr
,所以崩溃。是的,我故意不使用std::tuple,一旦我完成了书中处理它的方式,我会将它迁移到std::tuple。我知道它崩溃了。我的问题是,如果我使用TypeListGenerator instea,它不会编译类型列表的d。一旦我通过此错误,我将处理它。
main.cpp:148:7: error: template parameters not used in partial specialization:
 class FunctorImpl<R, typename TypeListGenerator<P1>::result> {
       ^
main.cpp:148:7: error:         'P1'