相关疑难解决方法(0)

std :: make_pair与std :: pair的构造函数的目的是什么?

目的是std::make_pair什么?

为什么不std::pair<int, char>(0, 'a')呢?

这两种方法有什么区别吗?

c++ stl std-pair

166
推荐指数
6
解决办法
8万
查看次数

为什么构造函数不能推导出模板参数?

template< class T >
class Foo {
public:
  Foo( T t ) { }
};

int main () {
  int i = 0;
  Foo f( i );
}
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,编译器抱怨在'f'之前缺少模板参数.我理解从构造函数的参数中推导出类的模板参数不是标准的一部分,但我的问题是为什么?编译器是否具有隐式实例化Foo<int>和调用其构造函数所需的所有信息?

编辑要清楚的是我打电话与构造int(而不是一个short,long,void*,等)

c++

58
推荐指数
4
解决办法
3613
查看次数

C++中的垃圾收集 - 为什么?

我一直听到人们抱怨C++没有垃圾收集.我还听说C++标准委员会正在考虑将其添加到该语言中.我担心我只是没有看到它的意义...使用智能指针的RAII消除了它的需要,对吧?

我对垃圾收集的唯一经验是在几台便宜的80年代家用电脑上,这意味着系统每隔一段时间就会冻结几秒钟.我确信它从那时起已有所改善,但正如你可以猜到的那样,这并没有让我对此持高度评价.

垃圾收集为经验丰富的C++开发人员提供了哪些优势?

c++ garbage-collection c++11

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

在C++ 1z中std :: make_pair和std :: make_tuple的用处

在我的理解中,存在的唯一理由std::make_pair,并std::make_tuple是,你不必自己写的类型,它们会自动推导.在C++ 1z中,我们对类模板进行了模板参数推导,这使我们可以简单地编写

std::pair p(1, 2.5); // C++1z
Run Code Online (Sandbox Code Playgroud)

代替

auto p = std::make_pair(1, 2.5); // C++11/14
Run Code Online (Sandbox Code Playgroud)

情况std::tuple类似.这导致以下问题:在C++ 1Z,有一种情况,其有利于使用std::make_pairstd::make_tuple替代使用的构造std::pairstd::tuple

请考虑纯C++ 1z代码(即不需要向后兼容C++ 14)并假设每个人都熟悉这个C++ 1z特性.

c++ c++17

20
推荐指数
1
解决办法
2170
查看次数

为什么不自动确定类模板构造函数参数?

考虑以下课程:

template<typename T1, typename T2>
class Pair
{
     public:
         T1 First;
         T2 Second;
         Pair(const T1 &First, const T2 &Second) : First(First), Second(Second) { }
}
Run Code Online (Sandbox Code Playgroud)

c ++中不允许以下内容:

auto p = Pair(10, 10);
Run Code Online (Sandbox Code Playgroud)

为什么不允许这样做?类型可以从构造函数调用中完全确定.
我知道有一些解决方法,如:

template<typename T1, typename T2>
Pair<T1, T2> MakePair(const T1 &First, const T2 &Second)
{
    return Pair<T1, T2>(First, Second);
}
Run Code Online (Sandbox Code Playgroud)

但为什么需要呢?为什么编译器不能像从函数模板那样从参数中确定类型?你可能会说它因为标准不允许它,所以为什么标准不允许呢?

编辑:
对于那些说这是一个例子的人,为什么不允许这样做:

template<typename T1, typename T2>
class Pair
{
     public:
         T1 First;
         T2 Second;
         Pair(const T1 &First, const T2 &Second) : First(First), Second(Second) { }
         Pair(const T2 …
Run Code Online (Sandbox Code Playgroud)

c++ templates

13
推荐指数
2
解决办法
3539
查看次数

通过几个类重用模板参数

我在下面用一个简单的代码复制了我遗漏的东西.
B类拥有A类作为成员并使用相同的类型名称.
我想避免复制这些模板,以便在main()中我可以调用类似B b(a,3.0)的东西来重用A中的模板.这可能吗?

#include <iostream>
#include <vector>

template<int N, typename T=double>
struct A
{
    A(T val) : vecA(N, val) {}
    void print() { for (auto i : vecA) std::cout << i << ";"; }
    std::vector<T> vecA;
};

template<int N, typename T>
struct B
{
    B(const A<N,T> & in, T scal) : a(in), scalB(scal) {}
    void print() { a.print(); std::cout << " | " << scalB << std::endl; }
    A<N,T> a;
    T scalB;
};


int main()
{
    A<5,float> …
Run Code Online (Sandbox Code Playgroud)

c++ templates c++11

12
推荐指数
2
解决办法
870
查看次数

构造函数的模板参数推导

C++ 0x是否具有(或者某个时间点的C++ 0x)构造函数的模板参数推导?在Coming C++(C++ 0x)标准概述中,我看到以下几行:

std::lock_guard l(m);   // at 7:00

std::thread t(f);       // at 9:00
Run Code Online (Sandbox Code Playgroud)

这是否意味着委派make_foo功能模板最终是多余的?

c++ templates constructor type-inference c++11

8
推荐指数
1
解决办法
2476
查看次数

是否允许矢量<auto>?(错误:无效使用'auto')

我有:

#include <cstdlib>
#include <vector>

using namespace std;

int main()
{
   auto a = -SOME_CONST_MAX;
   vector<auto> myVec {a, a, a, a};
}
Run Code Online (Sandbox Code Playgroud)

我不知道它的类型,SOME_CONST_MAX但我想制作一个类型的矢量-SOME_CONST_MAX.我认为vector<auto>它会起作用,因为它会从类型中推断出来a.

我正在运行这些错误: g++ -std=c++14 main.cpp

main.cpp:9:9: error: invalid use of ‘auto’
  vector<auto> myVec {a, a, a, a};
         ^
main.cpp:9:13: error: template argument 1 is invalid
  vector<auto> myVec {a, a, a, a};
             ^
main.cpp:9:13: error: template argument 2 is invalid
main.cpp:9:32: error: scalar object ‘myVec’ requires one element in initializer
  vector<auto> …
Run Code Online (Sandbox Code Playgroud)

c++ vector auto c++11

6
推荐指数
2
解决办法
1811
查看次数

C ++-是否可以在不指定类型的情况下实例化“ vector”?

非常基本,但是很难在Google中为我搜索。

我正在在线上进行C ++培训课程,主题是STL。在这种情况下vector

是否可以在vector不指定类型的情况下实例化a ?

#include <vector>
#include <iostream>

using namespace std;

int main()
{
    vector v1(10, 0);
    cout<<"Size: "<<v1.size()<<endl;
    for(unsigned i = 0; i < v1.size(); ++i)
    {
        cout<< v1[i]<<" ";
    }
    cout<<endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我认为这是错误的,但是我在整个课程中都看到了这一点,这使我感到困惑。

使用时vector<int> v1(10, 0)它会编译,这就是我的想法。

在使用NetBeans的过程中,但我认为没有配置或参数或任何可以实现该目标的东西,是吗?

c++ stl vector

5
推荐指数
2
解决办法
3040
查看次数

C ++定义具有允许值的类型

我正在编写一个简单的类来在AVR微控制器上设置串行端口。有些参数只有几个有意义的值,例如波特率,奇偶校验类型或停止位数。因此,我想创建一个类型,整数的子集,可以是1或2。我可以创建一个枚举类型:

enum stopBits { one, two };
Run Code Online (Sandbox Code Playgroud)

我不喜欢这种解决方案(拼写出波特率值吗?)。我想出了这个:

template<int vv> struct stopBits {
    static_assert( vv == 1 || vv == 2, "stop bit values can be 1 or 2");
    int value = vv;
};
// usage:
stopBits<2> s;
Run Code Online (Sandbox Code Playgroud)

我更喜欢这种方式,并且喜欢从编译器输出中获得有用的错误消息。我宁愿能够使用复制构造函数来初始化s:

// I'd like to have this
stopBits s = 2;
Run Code Online (Sandbox Code Playgroud)

这样,我将能够编写一个类似以下内容的类:

serial::serial(baudRate b, stopBits s = 1, parity p = none);
Run Code Online (Sandbox Code Playgroud)

在寻找解决方案时,我发现自己陷入了困境:模板参数推导,bounded :: integer库,不能为constexpr的函数参数thisthis。可以做到这一点,还是最好投降并继续前进?在此先感谢大家。

c++

3
推荐指数
1
解决办法
140
查看次数

在显式构造函数中键入推断

我正在使用以下代码来处理某些类型的安全提示,该代码在相关单元之间进行转换...

#include <cmath>
#include <limits>

template <typename T>
class Pascal
{

private:
    T val;

public:
    explicit Pascal(const T val_)
    {
        val = val_;
    }

    operator T() const
    {
        return val;
    }

};

template <typename T>
class dbSPL {
private:
    T val;

public:
    explicit dbSPL(const Pascal<T> p)
    {
        auto infProtect = std::numeric_limits<T>::min();
        val = 20.0 * std::log10( infProtect + p / 20e-6 );
    }


    operator T() const
    {
        return val;
    }


};
Run Code Online (Sandbox Code Playgroud)

我想知道是否可以从构造函数参数类型推断模板类型,而不是显式声明模板参数.例如auto p = Pascal(0.5),而不是打字auto p = …

c++ templates constructor c++11

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