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>)
uj5u.com熱心網友回復:
問題是,你不應該#include在模塊宣告之后使用export module xxx。
模塊的引入并沒有改變什么#include意思(好吧,在大多數情況下),#include仍然意味著“在這里復制粘貼這個檔案”。您的#include-ing 將<concepts>其所有內容及其傳遞性包含粘貼到您的模塊中,并且您的模塊現在“擁有”這些定義(它們具有模塊鏈接)。編譯器對屬于模塊的名稱進行了不同的處理,這就是導致聯結器錯誤的原因。
您應該使用全域模塊片段來處理#include-ing 的事情:
module;
#include <concepts>
export module test;
// contents
或者使用“頭單元”(前提是您的編譯器支持它們):
export module test;
import <concepts>;
// contents
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/388426.html
標籤:C 模板 C 20 c -概念 c -modules
上一篇:如何對元素XSL進行兩次轉換
