当前位置: 首页 > 知识库问答 >
问题:

如何在类模板中实现“完美转发”?

卢和昶
2023-03-14

我有一个带有模板参数T的类模板和一个类型为T的成员。我想用传递给ctor的参数初始化该成员,如果传递的参数是右值引用并且T支持移动语义,我还想移动该参数:

template <typename T>
class C {
public:
    explicit C(T t) : t_(t)
    {
    }

    explicit C(T&& t) : t_(std::move(t))
    {
    }

    ...

 private:    
    T t_;
 };

如果我试图将右值引用传递给ctor,则g 4.8会给出以下错误:

int main()
{
    int x = 0;
    C<int> p1{x}; // OK
    C<int> p2{1}; // error g++-4.8: call of overloaded ‘C(<brace-enclosed initializer list>)’ is ambiguous
    return 0;
}

错误全文:

g++-4.8 -std=c++11 -O2 -Wall -pedantic -pthread main.cpp
    main.cpp: In function ‘int main()’:
    main.cpp:23:16: error: call of overloaded ‘C()’ is ambiguous
    C p2{1}; // error g++-4.8: call of overloaded ‘C()’ is ambiguous
              ^
    main.cpp:23:16: note: candidates are:
    main.cpp:12:11: note: C::C(T&&) [with T = int]
      explicit C(T&& t) : t_(std::move(t))
               ^
    main.cpp:8:14: note: C::C(T) [with T = int]
     explicit C(T t) : t_(t)
              ^
    main.cpp:6:7: note: constexpr C::C(const C&)
     class C {
           ^
    main.cpp:6:7: note: constexpr C::C(C&&)

有人能帮帮我吗?谢谢!

共有1个答案

隆璞
2023-03-14

我通过引用C(t)const中的参数t解决了这个问题。

 类似资料:
  • 假设我有一个模板类Foo,具有两个模板参数和一个模板成员函数。 我想在模板类是部分专门化的情况下进行成员函数专门化,但以下代码被g编译失败 G说: 错误:在' 模板 我试过了 而g抱怨更多 能不能可能,怎么做?

  • 我想创建两个带有模板方法(GOF)变体的HttpServlet。所以我创建了从HttpServlet扩展的抽象类: 两种混凝土等级: 在调用(成功)其中一个服务后,我无法得到任何响应。经过一些调试,Tomcat似乎在NIO通道和锁存器方面有一些问题: 2016-01-31 19:13:52 Http11NioProtocol[DEBUG]套接字:[org.apache.tomcat.util.ne

  • 在G++中如何做到这一点? 声明类模板ss。[确定] 取消静态函数模板f[ok] 如何专门化f?[错误] 这段代码对于VC++是可以的。 在线:https://godbolt.org/z/qgq6bp

  • 问题内容: Django在其模板中将其视为某些变量。我怎样才能逃避或或使得Django不把它当作变量。 应该打印完全一样。 问题答案: 我相信您正在寻找template标签。 如链接到文档所述, 由于模板系统没有“转义”的概念,因此要显示模板标签中使用的位之一,必须使用标签。 例如: 将显示为:

  • 问题内容: Django 在其模板中将其视为某些变量。我怎样才能逃避或使得Django不把它当作变量。 应该打印完全一样。 问题答案: 相信你正在寻找模板标记。 如链接到文档所述, 由于模板系统没有“转义”的概念,因此要显示模板标签中使用的位之一,必须使用标签。 例如: 将显示为:

  • 考虑一下问题: 我们有一个带有抽象方法的类。现在,我们希望强制此方法的每个覆盖都将执行一些参数检查或其他一些苦差事。我们希望此参数检查在所有覆盖中都相同。一种解决方案是将此行为包装在一个调用抽象方法的非抽象方法中: 我想让私有,这样的任何子类都不能在不检查其参数的情况下偶然调用它。不幸的是,这是不可能的: 错误:(9,5)Kotlin:修饰符“private”与“abstract”不兼容 Kotl