【问题标题】:C++ access control not working for templated objects [duplicate]C ++访问控制不适用于模板化对象[重复]
【发布时间】:2021-08-22 22:46:48
【问题描述】:

问题

这是我面临的一个问题的人为示例。我有一个带有 map 函数的模板化对象,该函数创建一个新对象并对该新对象内的私有(或受保护,无关紧要)成员进行操作。

template<typename T>
class Foo {
public:
    template<typename R>
    Foo<R> map(std::function<R(std::optional<T>)> &&function) {
        auto mappedValue = function(mValue);
        
        Foo<R> f{};
        f.mValue = mappedValue;
    }
    
private:
    std::optional<T> mValue;
};

只要TR 相同,它就可以正常工作。例如:

int main()
{
    Foo<int> f1{};
    Foo<int> f2 = f1.map<int>([](std::optional<int> value) {
        if (value.has_value()) {
            return value.value() + 1;   
        }
        else {
            return 1;
        }
    });

    return 0;
}

但是,当我T != R 时,我遇到了问题:

int main()
{
    Foo<int> f1{};
    Foo<double> f2 = f1.map<double>([](std::optional<int> value) {
        if (value.has_value()) {
            return value.value() + 1.0;   
        }
        else {
            return 1.0;
        }
    });

    return 0;
}
main.cpp:22:11: error: ‘std::optional Foo::mValue’ is private within this context
         f.mValue = mappedValue;
         ~~^~~~~~
main.cpp:26:22: note: declared private here
     std::optional<T> mValue;
                      ^~~~~~

问题

这很容易理解。 C++ 访问控制在每个类的基础上工作,Foo&lt;int&gt;Foo&lt;double&gt; 不是同一个类。我什至可以通过添加:friend class Foo&lt;int&gt; 来解决问题。这不能很好地扩展,因为我不知道 TR 可能是什么。

有谁知道处理这个问题的通用方法并让Foo&lt;int&gt; 访问Foo&lt;double&gt; 的私有/受保护成员?

【问题讨论】:

标签: c++ templates access-control


【解决方案1】:

我想通了。

你需要将你当前的类声明为它自己的朋友。

template<typename T>
friend class Foo;

整个事情看起来像这样:

template<typename T>
class Foo {
public:
    template<typename R>
    Foo<R> map(std::function<R(std::optional<T>)> &&function) {
        auto mappedValue = function(mValue);
        
        Foo<R> f{};
        f.mValue = mappedValue;
    }
    
private:
    std::optional<T> mValue;

    template<typename T>
    friend class Foo;
};

【讨论】:

  • 可选:添加合理的构造函数或赋值操作。
猜你喜欢
  • 2013-01-27
  • 1970-01-01
  • 1970-01-01
  • 2021-03-11
  • 1970-01-01
  • 1970-01-01
  • 2017-11-15
  • 2017-05-18
  • 1970-01-01
相关资源
最近更新 更多