首页 > 解决方案 > 如何解决这个与 C++ 20 模块相关的问题?

问题描述

我在尝试使用C++(module)的新特性时遇到了一个问题,代码如下:

//Module.ixx
export module Module;

import <string>;
import <iterator>;
import <sstream>;
import <iomanip>;
import <cstdint>;

template<typename T>
class blake_mixin
{
public:

};

template<typename T, size_t N>
struct stream_width_fixer
{
    stream_width_fixer(T value) : v(value) {}
    T v;
};

template<typename T, size_t N>
std::ostream& operator<<(std::ostream& ostr, const stream_width_fixer<T, N>& value)
{
    return ostr << std::setw(N) << value.v;
}

template<typename T>
struct null_mixin
{
    //for example
    void sample()
    {
        std::ostringstream someone;
    }
};

class blake_provider
{
public:
    static const bool is_xof = false;

    blake_provider(size_t hashsize)
    {
        
    }

    ~blake_provider()
    {
        
    }
};

template<class HashProvider, template <class> class Mixin = null_mixin>
class hasher : public Mixin<HashProvider>
{
public:

    template<typename H = HashProvider>
    hasher(size_t hashsize) : provider(hashsize)
    {

    }
    template<typename H = HashProvider>
    inline std::string hexdigest() const
    {
        std::ostringstream res;
        res << std::setfill('0') << std::hex;
        return res.str();
    }


private:
    friend Mixin<HashProvider>;
    HashProvider provider;
};

export typedef hasher<blake_provider, blake_mixin> blake;
//main.cpp
import Module;
int main()
{
    blake(256).hexdigest();
}

代码混乱请见谅,代码没有实际意义,仅用于演示问题。因为我想问的更简洁一些,所以我简化了很多细节,但是问题很清楚。我只需要将这行代码添加到任何类中,它就会成功编译,

    void sample()
    {
        std::ostringstream someone;
    }

但我认为这种行为毫无意义,我很困惑,请告诉我哪里错了。非常感谢 不添加此代码时,会弹出错误消息

(68,28): error C2079: 'res' uses undefined class 'std::basic_ostringstream<char,std::char_traits<char>,std::allocator<char>>'

我用的开发工具是VS2019,我也在VS2020上试过,也会遇到同样的问题。

标签: c++visual-studiovisual-studio-2019c++20

解决方案


推荐阅读