GCC で C++ のモジュールをテンプレートありで作りたいです。
ヘッダーオンリーパッケージとして、以下のようなプロジェクト構成で
text
1$ tree . 2. 3├── hello 4│ └── greeting.hpp 5└── main.cpp 6 72 directories, 2 files
c++:hello/greeting.hpp
1#ifndef HELLO_GREETING_HPP_INCLUDED2#define HELLO_GREETING_HPP_INCLUDED3 4#include <print>5 6namespace hello {7 inline auto greeting(auto const & x) {8 std::println("Hello, {}!", x);9 }10}11 12#endif // #ifndef HELLO_GREETING_HPP_INCLUDED
c++:main.cpp
1#include <hello/greeting.hpp>2 3int main() {4 hello::greeting("C++");5}
次のようにしてコンパイル&実行:
bash
1g++-14 -std=c++23 -I . main.cpp -o main 2./main
できるものを C++20 で導入されたモジュールを使って作ろうと思って、以下のプロジェクト構成で
text
1$ tree . 2. 3├── hello.cpp 4└── main.cpp 5 61 directories, 2 files
c++:hello.cpp
1export module hello;2 3import <print>;4 5export namespace hello {6 auto greeting(auto const & x) {7 std::println("Hello, {}!", x);8 }9}
c++:main.cpp
1import hello;2 3int main() {4 hello::greeting("C++");5}
次のようにしてコンパイル&実行しようとしたのですが、
bash
1g++-14 -std=c++23 -fmodules-ts -x c++-system-header print 2g++-14 -std=c++23 -fmodules-ts hello.cpp main.cpp -o main 3./main
2行目で以下のエラーでコンパイルに失敗します。
text
1In file included from /usr/local/Cellar/gcc/14.1.0/include/c++/14/print:41, 2of module /usr/local/Cellar/gcc/14.1.0/include/c++/14/print, imported at hello.cpp:3, 3of module hello, imported at main.cpp:1: 4/usr/local/Cellar/gcc/14.1.0/include/c++/14/format: In instantiation of 'struct std::__format::_Runtime_format_string<char>': 5/usr/local/Cellar/gcc/14.1.0/include/c++/14/print:129:19: required from 'void std::println(format_string<_Args ...>, _Args&& ...) [with _Args = {const char (&)[4]}; format_string<_Args ...> = basic_format_string<char, const char (&)[4]>]' 6 129 | { std::println(stdout, __fmt, std::forward<_Args>(__args)...); } 7 | ~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 8hello.cpp:7:21: required from 'auto hello::greeting@hello(const auto:1&) [with auto:1 = char [4]]' 9 7 | std::println("Hello, {}!", x); 10 | ~~~~~~~~~~~~^~~~~~~~~~~~~~~~~ 11main.cpp:4:20: required from here 12 4 | hello::greeting("C++"); 13 | ~~~~~~~~~~~~~~~^~~~~~~ 14/usr/local/Cellar/gcc/14.1.0/include/c++/14/format:74:55: internal compiler error: Segmentation fault: 11 15 74 | template<typename _CharT, typename... _Args> struct basic_format_string; 16 | ^~~~~~~~~~~~~~~~~~~ 17Please submit a full bug report, with preprocessed source (by using -freport-bug). 18See <https://github.com/Homebrew/homebrew-core/issues> for instructions.
auto greeting(auto const & x)
のところを void greeting(char const * x)
と型指定するとコンパイル&実行できるのですが、auto
だとうまくいきません。テンプレートありで作る方法を教えてください。GCC のバージョンは以下の通りです。
text
1$ gcc-14 --version 2gcc-14 (Homebrew GCC 14.1.0) 14.1.0 3Copyright (C) 2024 Free Software Foundation, Inc. 4This is free software; see the source for copying conditions. There is NO 5warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
0 コメント