为什么此代码可以用g ++而不是MSVC ++编译?

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。

Ted*_*gmo 6

当您提供一个明确的定义实例化一个的构造函数(它实际上并没有按照标准的名称),你应该提供你想要实例化,像这样的签名做到这一点:

template
MatchesConfiguration::MatchesConfiguration(  // no <std::minstd_rand> here
    Configuration&&,
    std::minstd_rand&);
Run Code Online (Sandbox Code Playgroud)

[ temp.arg.explicit#2 ]

当引用构造函数模板的特殊化时,不得指定模板参数


来自旧笔记的琐事(从2006年开始):http :
//www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#581

可以显式实例化或专用化模板化的构造函数吗?

不能在构造函数调用中指定构造函数的模板参数(因为该构造函数没有名称,但是通过使用构造函数的类名称来调用)

[...]

有人观察到,在构造函数声明中明确指定模板参数实际上是没有必要的,因为根据定义,这些参数都是可推导的,因此可以省略。

请注意,正常功能模板可以具有不可推导的模板参数,必须为实例化或专业化显式提供模板参数。

感谢Davis Herring和MM的指导