首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有模板参数的Decltype

带有模板参数的Decltype
EN

Stack Overflow用户
提问于 2016-01-12 09:48:51
回答 1查看 2K关注 0票数 6

在test1.cpp下面编译,但test2.cpp不编译。两者的唯一区别是,我在test1.cpp中的类声明中定义了Handle::add_it,但在test2.cpp中定义了外部的类声明。

test1.cpp :g++ test1.cpp -o test1 -std=c++11

代码语言:javascript
复制
#include <iostream>

template<typename B>
class Handle
{
public:
        decltype(B.operator(int)) add_it(int x)
        {
                return b(x);
        }

        B b;
};

struct Add1
{
        int operator()(int x)
        {
                return x + 1;
        }
};

int main()
{
        Handle<Add1> h;
        std::cout << h.add_it(5) << std::endl;
}

test2.cpp :g++ test2.cpp -o test2 -std=c++11

代码语言:javascript
复制
#include <iostream>

template<typename B>
class Handle
{
public:
        decltype(B.operator(int)) add_it(int x);

        B b;
};

template<typename B>
decltype(B.operator(int)) Handle<B>::add_it(int x)
{
        return b(x);
}

struct Add1
{
        int operator()(int x)
        {
                return x + 1;
        }
};

int main()
{
        Handle<Add1> h;
        std::cout << h.add_it(5) << std::endl;
}

误差

代码语言:javascript
复制
test2.cpp:13:11: error: expected primary-expression before ‘.’ token
 decltype(B.operator(int))
           ^
test2.cpp:13:20: error: expected type-specifier before ‘(’ token
 decltype(B.operator(int))
                    ^
test2.cpp:13:21: error: expected primary-expression before ‘int’
 decltype(B.operator(int))
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-12 09:56:14

您可以使用std::declval对此进行修改。

代码语言:javascript
复制
template<typename B>
class Handle
{
public:
  decltype(std::declval<B>()(int())) add_it(int x) {
    return b(x);
  }

  B b;
};

Live Demo

或者超出了类的定义:

代码语言:javascript
复制
template<typename B>
class Handle {
public:
  decltype(std::declval<B>()(int())) add_it(int x);
  B b;
};

template<typename B>
decltype(std::declval<B>()(int())) Handle<B>::add_it(int x) {
  return b(x);
}

Live Demo

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

https://stackoverflow.com/questions/34740248

复制
相关文章

相似问题

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