导出需要标准概念的模板函数

Exporting template function requiring std concepts

IDE:MSVS 2022,/std:c++latest/experimental:module,x86;

目标 : 导出 T add(T,T)requires std::integral<T> ;

编译 (test.ixx) :

export module test;

template < typename T >
concept addable = requires ( T t1, T t2 ) {
    t1 + t2 ;
};

export template < typename T >
requires addable<T>
T add ( T t1, T t2 ) { return t1 + t2; }

这不是 (test.ixx) :

export module test;

#include <concepts>

export template < typename T >
requires std::integral<T>
T add ( T t1, T t2 ) { return t1 + t2; }

以上代码导致 2 个错误 LNK2019,详情如下 ;

尝试过

  1. #include <concepts> 在单独的实现文件中 - 失败;
  2. import std.core;,似乎还不支持 - 失败;

使用示例(main.cpp):

import test;
#include <iostream>

int main ()
{
    using namespace std;
   
    int    i = add(22,20);              // = 42
    double d = add(0.5,0.77);           // = 1.27

    cout << i << ", " << d << endl ;    // "42, 1.27"

    return 0;
}

有什么想法吗?

链接器错误详细信息:

LNK2019 : unresolved external symbol __imp__ldiv::<!test> referenced in function "struct test::_ldiv_t __cdecl div(long,long)" (?div@@YA?AU_ldiv_t@test@@JJ@Z::<!test>)
LNK2019 : unresolved external symbol __imp__lldiv::<!test> referenced in function "struct test::_lldiv_t __cdecl div(__int64,__int64)" (?div@@YA?AU_lldiv_t@test@@_J0@Z::<!test>)

问题是,你不应该在模块声明 export module xxx 之后使用 #include

模块的引入并没有改变#include的意思(好吧,在大多数情况下),#include仍然意味着“copy-paste这个文件在这里”。您的 #include-ing of <concepts> 将其所有内容及其传递包含粘贴到您的模块中,并且您的模块现在“拥有”这些定义(它们具有 模块链接 ).编译器将名称以不同方式属于模块,这就是导致链接器错误的原因。

您应该使用 全局模块片段 #include-ing 东西:

module;
#include <concepts>
export module test;
// contents

或使用“header 单位”(前提是您的编译器支持它们):

export module test;
import <concepts>;
// contents