其他分享
首页 > 其他分享> > c – 非推导上下文中模板参数推导的解决方法

c – 非推导上下文中模板参数推导的解决方法

作者:互联网

请考虑以下代码:

#include <iostream>

template<class T>
struct outer {
    struct inner {};
};

template<class T>
std::ostream& operator<<(std::ostream & stream, 
                         typename outer<T>::inner const& value) {
    std::cout << "An outer::inner!";
    return stream;
}

int main() {
    outer<float>::inner foo;

    std::cout << foo << std::endl; // does not compile
}

这不会编译,因为typename outer< T> :: inner是一个非弱的上下文(如here所解释的),这意味着编译器无法推断出template-argument-type(为了原因,请阅读this answer).在我看来,我有两个选项让它工作:

>将内部移到外部,使其成为类模板.我更喜欢这个,因为对使用代码的影响较小.
>向内部添加to_string方法.

是否有任何其他解决方案(在使用代码中不会导致丑陋的语法)?

解决方法:

您可以将操作符移动到内部类主体中并将朋友放在其前面.然后只用inner替换参数类型.

另一种技术是从内部参数化的CRTP基础派生内部.然后使参数键入CRTP类并将参数引用强制转换为派生的内部类,其类型由您推导出的模板参数给出.

标签:template-deduction,c,templates
来源: https://codeday.me/bug/20190917/1810072.html