我已经使用模板构造函数定义了模板class buffer
和另一个class buffer_view
,以获取class buffer
的任何定义。我们的想法是buffer_view
充当任何buffer
类型的单一类型引用。
template<size_t N> class buffer
{
private:
friend class buffer_view;
};
class buffer_view
{
public:
template<size_t N>
buffer_view(const buffer<N>& bfr)
:m_size(N) {}
size_t size() const { return m_size; }
private:
size_t m_size;
};
它似乎按预期工作:
void foo(const buffer_view& bview)
{
std::cout << bview.size() << " _ " << std::flush;
}
int main() {
buffer<8> bfr;
buffer_view bview(bfr);
foo(bview);
foo(buffer_view(bfr));
foo(buffer_view(buffer<32>()));
}
8 _ 8 _ 32 _
然而,这不起作用:
buffer_view bview2(buffer<16>());
foo(bview2);
bview2
获取类型buffer_view (buffer<16U> (*)())
或buffer_view (* )(buffer<16u> (*)())
?请参阅错误消息:
MSVC 15.1
错误(活动)E0415没有合适的构造函数可以将“buffer_view(buffer&lt; 16U&gt;(*)())”转换为“buffer_view”
gcc 5.3.0
错误:'const buffer_view&amp;'类型的引用无效初始化来自'buffer_view(*)类型的表达式(缓冲区&lt; 16u&gt;(*)())'
注意:传递'bool foo(const buffer_view&amp;)'的参数1
最好我可以告诉类型buffer_view (* )(buffer<16u> (*)())
是一个返回buffer_view
的函数的函数指针,并将一个函数指针作为参数,该函数指针不带参数并返回buffer<16u>
?
我的问题是,发生了什么?为什么它在命名变量中使用时不能按预期工作,但在临时foo(buffer_view(buffer<32>()))
中使用时会如此? - 语法似乎与我类似。