导出需要标准概念的模板函数
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
,详情如下 ;
尝试过
#include <concepts>
在单独的实现文件中 - 失败;
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
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
,详情如下 ;
尝试过
#include <concepts>
在单独的实现文件中 - 失败;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