arn*_*olt 5 c++ visual-c++ c++14
我正在尝试编译一些开源代码(https://github.com/BieremaBoyzProgramming/bbpPairings),我可以使用g++
(v6.3.0)在linux上进行编译,但是无法在Visual Studio(VS)中进行编译社区2019 / 16.1.5),但有些模糊(对我来说,但我的C ++确实很弱)错误:“错误C2143:语法错误:缺少';' 在“ <”之前。
源代码中有问题的代码在这里,但是从代码中提取的最小示例是:
#include <iostream>
#include <random>
class Configuration {};
class MatchesConfiguration {
public:
template <class RandomEngine>
MatchesConfiguration(
Configuration&&,
RandomEngine&);
};
template <class RandomEngine>
MatchesConfiguration::MatchesConfiguration(
Configuration&& configuration,
RandomEngine& randomEngine) {}
template
MatchesConfiguration::MatchesConfiguration<std::minstd_rand>( // <--- SYNTAX ERROR HERE
Configuration&&,
std::minstd_rand&);
int main()
{
std::cout << "Hello World!\n";
}
Run Code Online (Sandbox Code Playgroud)
我看过有关错误代码的MSDN描述,但是我对C ++和模板的理解太微不足道,无法找出问题所在。项目README表示预期会使用C ++ 14(对于FS来说有一些可选的C ++ 17东西,我认为在这里不重要),但据我从功能兼容性表中可以看出,所有C + VS 2019应该支持+14。
当您提供一个明确的定义实例化一个的构造函数(它实际上并没有按照标准的名称),你应该提供你想要实例化,像这样的签名做到这一点:
template
MatchesConfiguration::MatchesConfiguration( // no <std::minstd_rand> here
Configuration&&,
std::minstd_rand&);
Run Code Online (Sandbox Code Playgroud)
当引用构造函数模板的特殊化时,不得指定模板参数
来自旧笔记的琐事(从2006年开始):http :
//www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#581
“ 可以显式实例化或专用化模板化的构造函数吗? ”
不能在构造函数调用中指定构造函数的模板参数(因为该构造函数没有名称,但是通过使用构造函数的类名称来调用)
[...]
有人观察到,在构造函数声明中明确指定模板参数实际上是没有必要的,因为根据定义,这些参数都是可推导的,因此可以省略。
请注意,正常功能模板可以具有不可推导的模板参数,必须为实例化或专业化显式提供模板参数。
感谢Davis Herring和MM的指导