首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将匿名临时函数对象传递给模板化构造函数时出现的问题

将匿名临时函数对象传递给模板化构造函数时出现的问题
EN

Stack Overflow用户
提问于 2010-04-06 21:15:29
回答 3查看 568关注 0票数 3

我正在尝试附加一个要在销毁模板化类时调用的函数对象。但是,我似乎无法将function-object作为临时对象进行传递。我得到的警告是(如果注释行为xi.data = 5;):

代码语言:javascript
复制
    warning C4930: 'X<T> xi2(writer (__cdecl *)(void))': 
    prototyped function not called (was a variable definition intended?)
            with
            [
                T=int
            ]

如果我尝试使用构造的对象,我得到一个编译错误,说:

代码语言:javascript
复制
error C2228: left of '.data' must have class/struct/union

我为这段冗长的代码道歉,但我认为所有组件都需要可见才能评估情况。

代码语言:javascript
复制
template<typename T>
struct Base
{
    virtual void run( T& ){}
    virtual ~Base(){}
};

template<typename T, typename D>
struct Derived : public Base<T>
{
    virtual void run( T& t )
    {
        D d;
        d(t);
    }
};

template<typename T>
struct X
{
    template<typename R>
    X(const R& r)
    {
       std::cout << "X(R)" << std::endl;
       ptr = new Derived<T,R>(); 
    }

    X():ptr(0)
    { 
        std::cout << "X()" << std::endl; 
    }

    ~X()
    {
        if(ptr) 
        {
            ptr->run(data);
            delete ptr;
        }
        else
        {
            std::cout << "no ptr" << std::endl;
        }
    }

    Base<T>* ptr; 
    T data;
};

struct writer
{
    template<typename T>
    void operator()( const T& i )
    { 
        std::cout << "T : " << i << std::endl;
    }
};

int main()
{
    {
        writer w;
        X<int> xi2(w);
        //X<int> xi2(writer()); //This does not work!
        xi2.data = 15;       
    }

    return 0;
};

我尝试这样做的原因是,我可以“以某种方式”将函数对象类型与对象附加在一起,而不需要在类中保留函数对象本身的实例。因此,当我创建class X的对象时,我不需要在其中保留一个class writer的对象,只需要一个指向Base<T>的指针(我不确定是否需要在这里使用<T>,但现在它就在这里)。

问题在于,我似乎必须创建一个writer对象,然后将其传递给X的构造函数,而不是像X<int> xi(writer();那样调用它

我可能遗漏了一些非常愚蠢和明显的东西,有什么建议吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-04-06 21:21:01

看起来像是一个“最烦人的解析”问题。试一试

代码语言:javascript
复制
X<int> xi2 = X<int>(writer());

代码语言:javascript
复制
X<int> xi2((writer()));
票数 7
EN

Stack Overflow用户

发布于 2010-04-06 21:20:43

尝试在X<int> xi2((writer()));周围多加一对括号,这将阻止编译器认为您预先声明了一个函数。(Scott Meyer有效STL第6项。)

票数 5
EN

Stack Overflow用户

发布于 2010-04-06 21:21:32

X<int> xi2(writer());是一个名为xi2的函数的声明,该函数本身返回一个X<int>,并接受一个不带参数的函数作为参数,并返回一个编写器。这是一个“最烦人的解析”。

解决方案是要么做你已经做过的事情,避免临时的,要么添加更多的圆括号。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2585021

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档