gpt4 book ai didi

c++ - "could not convert template argument"到它自己的类型

转载 作者:搜寻专家 更新时间:2023-10-31 01:13:30 27 4
gpt4 key购买 nike

我正在尝试制作一种可以类型安全地封装任意类型的类型。我脑子里的想法是这个答案可能是可能的:5 years later, is there something better than the "Fastest Possible C++ Delegates"?到目前为止我只是成功地移动了问题,但我遇到了一个我无法找到根源的错误。

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

我正在运行带有 llvm-gcc 4.2(gcc 4.2.1 前端)的 Mac OS X 10.6。

欢迎提出有关如何摆脱 void* 或将其移至不太重要的位置的建议,但这个问题并不是真正的问题。

错误:

$ 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*’

代码:

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
}

最佳答案

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

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

关于c++ - "could not convert template argument"到它自己的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12427352/

27 4 0