type-conversion - c++17函数模板参数在编译过程中未能转换类型

  显示原文与译文双语对照的内容
109 3

尝试使用调用类 static 函数模板专用的函数模板时,它无法将它的参数从模板参数列表转换为模板。

下面是我在main中调用的函数:


template<class Engine, typename Type, template<typename = Type> class Distribution, class... DistParams>


Type randomGenerator( RE::SeedType seedType, std::size_t seedValue, std::initializer_list<std::size_t> list, DistParams... params ) {


 static Type retVal = 0;


 static Engine engine = RE::getEngine<Engine>( seedType, seedValue, list );


 static Distribution<Type> dist = RD::getDistribution<Type, Distribution>( params... );


 retVal = dist( engine );


 return retVal;


}



关于上述功能的一点信息:

Type 表示分发的返回值,例如 intunsignedchar 等,这些分发的值如下所示。 uniform_int_distribution<IntType> 或者 Real Types,例如 float,例如用于分发的doubleuniform_real_distribution<RealType>

术语 RE & RD 是两个类的typedef 。


typedef RandomEngine RE;


typedef RandomDistribution RD;



两个类都遵循与删除构造函数相同的Pattern,并且它们的所有方法都声明为 static 。

函数中的2nd 行使用模板参数 <class Engine> 表示我们要从 class RandomEngine{...}的static 方法中使用的<random> 头文件的引擎类型。 每个引擎类型都有自己的功能来创建引擎。种子类型和种子值,然后返回引擎引用。 RandomEngine class 中的所有函数都不是模板函数。 于是我继续做了广义函数模板 RE::getEngine<Engine>( parameters ); 在这个 RandomEngine class 中,你可以在这个函数模板 randomGenerator() 中看到。 然后我为每个引擎类型专用这个函数。 我这样做没有问题。

在我尝试遵循类似于的类似 Pattern的情况下,这将带我到下一行,我将一个通用函数模板做为例子 RD::getDistribution<Type, Distribution>( params... );

在我到达目的地之前 RD::getDistribution<...>(...) 上面的两个类都不是模板。 第一类 RandomEngine 具有零函数模板( 除了广义 getEngine() 之外),区别在于类的每个函数都是函数模板,因为库函数的分布需要它。 因这里,现在我不仅要模拟这个广义函数,还必须使用一个可以变参数包。

下面是我在 RandomDistribution 类中的广义函数的声明,该函数在头 file: 中


template<typename Type, template<typename = Type> class Distribution, class... DistParams>


static Distribution<Type>& getDistribution( DistParams... params ) {


 return getUniformIntDistribution( params... );


}



然后,我尝试了为这里函数中的这个函数进行专门化,只有它的他一个分发版本:


template<>


static std::uniform_real_distribution<>& RandomDistribution::getDistribution() {


 return RandomDistribution::getUniformRealDistribution();


}



我想为我所支持的所有其他发行版做这件事。

我在主要功能中使用独立函数模板 randomGenerator(),如下所示:


{


 std::initializer_list<std::size_t> list{};


 unsigned val = randomGenerator<std::mt19937, unsigned, std::uniform_int_distribution>


 ( RE::USE_CHRONO_CLOCK, std::size_t( 12 ), list, 1, 100 );


 std::cout <<val <<std::endl;



}



编译 RandomGenerator.cpp 文件时没有错误编译;但是,当编译 main.cpp 时,会出现编译器错误指出它不能从编译器转换。 std::uniform_int_distribution<int>&std::uniform_int_distribution<Type>&

它指向我的类函数模板,它是在 RandomGenerator.h 文件中声明的。

由于某些原因,Type 未被分配或者转换为传递到 randomGenerator's 模板参数列表的类型。

我被stuck了。 我知道编译器消息是什么意思;我不需要做什么来修正。 可以做什么来解决这里转换失败?

时间: 原作者:

...