"无法转换模板参数"自己的类型

时间:2012-09-14 15:16:05

标签: c++ templates non-type

我正在尝试创建一个可以类型安全地封装任意类型的类型。我在脑海中得到了一个想法,这可能来自这个答案: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。

关于如何摆脱虚空*或将其移至不那么重要的位置的建议值得欢迎,但这个问题并非如此。

错误:

$ 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
}

1 个答案:

答案 0 :(得分:4)

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

我希望我可以提出一个替代方案,以实现你想要的,但我无法理解你实际上想要做什么。