相关疑难解决方法(0)

本地班级的会员模板

给出以下代码:

 void f()
 {
     class A
     {
         template <typename T>
         void g() {}
     };
 }
Run Code Online (Sandbox Code Playgroud)

g ++ 4.4(以及 g++-4.6 -std=gnu++0x)抱怨:"本地类中成员模板的声明无效".

显然,本地类不允许有模板成员.这种限制的目的是什么?它会在C++ 0x中删除吗?

注意:如果我将本地类本身设为模板,而不是给它一个模板成员:

 void f()
 {
     template <typename T>         
     class A
     {
         void g() {}
     };
 }
Run Code Online (Sandbox Code Playgroud)

我得到"错误:模板声明不能出现在块范围内".

c++ templates local-class c++11

46
推荐指数
1
解决办法
1万
查看次数

在通用lambda中使用`if constexpr`访问成员类型需要两个分支都是格式良好的 - gcc vs clang

考虑两个struct具有不同成员类型别名的s:

struct foo { using x = int;   };
struct bar { using y = float; };
Run Code Online (Sandbox Code Playgroud)

给定Ttemplate情况下,我想无论是T::x还是T::y取决于什么T是:

template <typename T>
auto s()
{
    auto l = [](auto p) 
    {
        if constexpr(p) { return typename T::x{}; }
        else            { return typename T::y{}; }
    };

    return l(std::is_same<T, foo>{});
}

int main() 
{ 
    s<foo>(); 
}
Run Code Online (Sandbox Code Playgroud)

g++编译上面的代码,同时clang++产生这个错误:

error: no type named 'y' in 'foo'
        else            { return typename …
Run Code Online (Sandbox Code Playgroud)

c++ sfinae language-lawyer c++17 if-constexpr

19
推荐指数
1
解决办法
363
查看次数

非依赖名称查找和lambda

我有以下代码:

template <class T>
class Outer
{
public:
    Outer();

    template <class U>
    void templateFunc()
    {
    }

private:
    class Inner
    {
    public:
        Inner(Outer& outer)
        {
            outer.templateFunc<int>();
            Outer* outer_ptr = &outer;
            [outer_ptr]() 
            {
                outer_ptr->templateFunc<int>();
            }();
        }
    };

    Inner m_inner;
};

template <class T>
Outer<T>::Outer()
    : m_inner(*this)
{
}

int main()
{
    Outer<double> outer;
}
Run Code Online (Sandbox Code Playgroud)

如您所见,有一个模板类包含一个嵌套类,它在构造函数中调用其封闭类的一些模板方法.AFAIK,即使封闭类是一个模板类 - 对于嵌套类,它是一个非依赖名称,因此调用其模板方法不template应该是一个问题.当我在嵌套类的构造函数中定义lambda,捕获指向外部类的指针,并尝试调用相同的模板方法时,问题就出现了 - g ++ 7.2给出了以下编译错误:

prog.cc: In lambda function:

prog.cc:22:41: error: expected primary-expression before 'int'
                outer_ptr->templateFunc<int>();
                                        ^~~
prog.cc:22:41: error: expected ';' before 'int'
Run Code Online (Sandbox Code Playgroud)

但是,g …

c++ lambda templates language-lawyer c++11

16
推荐指数
1
解决办法
331
查看次数