相关疑难解决方法(0)

为什么不从构造函数推断模板参数?

今天我的问题很简单:为什么编译器不能从类构造函数中推断模板参数,就像它可以从函数参数那样做?例如,为什么以下代码无效:

template<typename obj>
class Variable {
      obj data;
      public: Variable(obj d)
              {
                   data = d;
              }
};

int main()
{
    int num = 2;
    Variable var(num); //would be equivalent to Variable<int> var(num),
    return 0;          //but actually a compile error
}
Run Code Online (Sandbox Code Playgroud)

正如我所说,我明白这是无效的,所以我的问题是为什么不是呢?允许这会产生任何重大的句法漏洞吗?是否存在不希望使用此功能的实例(推断类型会导致问题)?我只是想了解允许函数的模板推理背后的逻辑,但不适用于适当构造的类.

c++ parameters templates inference

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

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

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
查看次数

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

考虑以下课程:

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
查看次数

构造函数的模板参数推导

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
查看次数