使用非模板类和模板构造函数时的意外类型

时间:2017-06-21 17:00:09

标签: c++ class templates

我已经使用模板构造函数定义了模板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>()))中使用时会如此? - 语法似乎与我类似。

0 个答案:

没有答案