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++ &引用;无法转换模板参数";自成一格_C++_Templates_Non Type - Fatal编程技术网

C++ &引用;无法转换模板参数";自成一格

C++ &引用;无法转换模板参数";自成一格,c++,templates,non-type,C++,Templates,Non Type,我正在尝试创建一个可以安全地封装任意类型的类型。我脑子里的想法是,从这个答案来看,这可能是可能的:到目前为止,我只成功地解决了这个问题,但我遇到了一个我找不到根源的错误 编译器似乎告诉我它不能将值强制转换为值自己的类型,这让我觉得很奇怪 我使用llvm gcc 4.2(gcc 4.2.1前端)运行Mac OS X 10.6 关于如何消除这种空虚感或将其转移到一个不那么重要的位置的建议是受欢迎的,但这个问题并不是关于这个 错误: $ g++ main.cpp main.cpp: In static

我正在尝试创建一个可以安全地封装任意类型的类型。我脑子里的想法是,从这个答案来看,这可能是可能的:到目前为止,我只成功地解决了这个问题,但我遇到了一个我找不到根源的错误

编译器似乎告诉我它不能将值强制转换为值自己的类型,这让我觉得很奇怪

我使用llvm gcc 4.2(gcc 4.2.1前端)运行Mac OS X 10.6

关于如何消除这种空虚感或将其转移到一个不那么重要的位置的建议是受欢迎的,但这个问题并不是关于这个

错误:

$ g++ main.cpp
main.cpp: In static member function ‘static Stamp StampFactory<T>::make(T*) [with T = int]’:
main.cpp:33:   instantiated from ‘Stamp makeStamp(T*) [with T = int]’
main.cpp:39:   instantiated from here
main.cpp:26: error: could not convert template argument ‘t’ to ‘int*’
$g++main.cpp
main.cpp:在静态成员函数“static Stamp StampFactory::make(T*)[with T=int]”中:
main.cpp:33:从“Stamp makeStamp(T*)[with T=int]实例化”
main.cpp:39:从此处实例化
main.cpp:26:错误:无法将模板参数“t”转换为“int*”
守则:

typedef void (*VoidFunc)(void*);

struct Stamp
{
    Stamp(VoidFunc p)
    {
        this->press = p;
    }
    VoidFunc press;
};

template<typename T>
struct StampFactory
{
    template<T* rvalue>
    struct Pattern
    {
        void operator()(void* lvalue)
        {
            *dynamic_cast<T*>(lvalue) = *rvalue;
        }
    };

    static Stamp make(T* t)
    {
        return Stamp(Pattern<t>()); // 28
    }
};

template<typename T>
Stamp makeStamp(T* t)
{
    return StampFactory<T>::make(t); // 33
}

int main(int argc, char** argv)
{
    int i = 0;
    Stamp s = makeStamp(&i); //39
}
typedef void(*VoidFunc)(void*);
结构戳记
{
邮票(作废)
{
这个->按=p;
}
真空压力机;
};
样板
结构冲压厂
{
样板
结构模式
{
void运算符()(void*左值)
{
*动态施法(左值)=*右值;
}
};
静态邮票制作(T*T)
{
返回戳记(Pattern());//28
}
};
样板
邮票制作邮票(T*T)
{
return StampFactory::make(t);//33
}
int main(int argc,字符**argv)
{
int i=0;
Stamp s=makeStamp(&i);//39
}

该错误是由于模板参数必须是编译时常量(或
constepr
),因此不能是变量(或函数参数)。它允许有一个指针作为模板参数,但是没有多少可以提供给它,因为它需要是一个编译时常量指针值(我能想到的唯一限定条件是一个指向字符串文本的char指针)。一般规则很简单:无论是类型还是值,所有模板参数都必须在编译时已知。这不包括函数参数或其他类型的运行时变量


我希望我能提出一个替代方案来实现您的愿望,但我根本无法理解您实际想要做什么。

错误是因为模板参数必须是编译时常量(或
constepr
),因此不能是变量(或函数参数)。它允许有一个指针作为模板参数,但是没有多少可以提供给它,因为它需要是一个编译时常量指针值(我能想到的唯一限定条件是一个指向字符串文本的char指针)。一般规则很简单:无论是类型还是值,所有模板参数都必须在编译时已知。这不包括函数参数或其他类型的运行时变量


我希望我能提出一个替代方案来实现您的愿望,但我根本无法理解您实际想要做什么。

这可能很愚蠢,但Pattern不应该是Pattern吗?因为t是函数参数的名称?@Borgeader:查看Pattern的声明,我认为这不是打字错误。@Borgeader我将t作为t*类型的非类型模板参数传递。这部分是对的,但不太容易理解;我花了几个小时思考另一个问题的回答者为达到类似效果所做的事情。
t
的值在编译时是未知的..?非类型模板参数必须是编译时常量。另外,
dynamic\u cast
仅当其操作数是指向多态类型的引用或指针时才起作用,并且从不与
void*
一起使用。这可能很愚蠢,但鉴于t是函数参数的名称,Pattern不应该是Pattern吗?@Borleader:查看Pattern的声明,我认为这不是打字错误。@Borgeader我将t作为t*类型的非类型模板参数传递。这部分是对的,但不太容易理解;我花了几个小时思考另一个问题的回答者为达到类似效果所做的事情。
t
的值在编译时是未知的..?非类型模板参数必须是编译时常量。另外,
dynamic\u cast
仅当其操作数是指向多态类型的引用或指针时才起作用,并且从不与
void*
一起工作。根本问题是,我有一个项目,在该项目中,我试图将字符串映射传递给任意数据,我试图避免void*,但我想这是必要的。我想创建一个类型,它不要求用户代码知道所包含值的类型(因此可以在一个映射中将不同的类型分组在一起),并允许用户代码通过传递一个引用或指针来检索该值,该引用或指针的类型是由之前人类对该类型的了解所确定的。@Jess请查看Boost。是否(www.boost.org/libs/any/index.html)或boost.Variant(www.boost.org/doc/html/Variant.html),这似乎正是您所寻找的。根本问题是,我有一个项目,在该项目中,我试图将字符串映射传递给任意数据,我试图避免void*但我想这是必要的。我想创建一个类型,它不要求用户代码知道包含值的类型(因此不同的类型可以在一个映射中组合在一起),并允许用户代码通过传递一个引用或指针来检索该值,该引用或指针的类型是由人类对该类型的先验知识确定的。@请查看Boost.Any(www.Boost.org/libs/Any/index.html)或Boost.Variant(www.Boost.org/doc/html/Variant.html),它似乎就是你要找的。