模板专用化的实例化不正确
Incorrect instantiation of template specialization
在下面的代码中,我尝试将类A
专用化为模板参数T
具有值B<m>
的基本情况。
#include <array>
#include <iostream>
template <std::size_t m>
struct B
{
std::array<double,m> arr;
};
template <std::size_t n, typename T>
struct A
{
std::array<T,n> arr;
const static int inner_dim = T::inner_dim;
};
template <std::size_t n >
template <std::size_t m>
struct A<n,B<m>>
{
std::array<B<m>,n> arr;
const static int inner_dim = m;
};
int main(int argc, char *argv[])
{
A<5,A<4,B<3>>> a;
std::cout << a.inner_dim << std::endl;
A<5,B<4>> b;
std::cout << b.inner_dim << std::endl;
return 0;
}
但是,在main的实例化中,当我使用g ++ 5.4编译时,我收到以下错误:
$ g++ -Wall --std=c++11 specialization.cc
specialization.cc: In instantiation of ‘const int A<4ul, B<3ul> >::inner_dim’:
specialization.cc:15:20: required from ‘const int A<5ul, A<4ul, B<3ul> > >::inner_dim’
specialization.cc:30:18: required from here
specialization.cc:15:20: error: ‘inner_dim’ is not a member of ‘B<3ul>’
const static int inner_dim = T::inner_dim;
^
specialization.cc: In instantiation of ‘const int A<5ul, B<4ul> >::inner_dim’:
specialization.cc:33:18: required from here
specialization.cc:15:20: error: ‘inner_dim’ is not a member of ‘B<4ul>’
似乎只使用一般定义,而不是专业化。如何确保实例化正确的专业化?
我的猜测是
template <std::size_t n >
template <std::size_t m>
struct A<n,B<m>>
应该是
template <std::size_t n, std::size_t m>
struct A<n,B<m>>
相关文章:
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- 函数在可变参数模板的实例化期间不可见
- 为什么显式模板实例化不会破坏 ODR?
- 需要实例化不同类/对象并在启动时确定的硬件插槽的设计模式
- 实例化具有不完整类型的类模板格式不正确(如果该类型是在之后定义的)
- 为什么显式模板实例化不起作用
- unique_ptr 使用尚未定义的参数进行实例化不会导致错误
- 模板实例化失败:编译器选择不正确的重载函数
- 为什么显式模板实例化不起作用?
- C++标准是否明确允许/禁止实例化不完整类型的 std::函数?
- C++:unique_ptr初始化不正确
- 模板函数是否以内联方式声明 constexpr,即使实例化不是 constexpr
- 将 SFINAE 上下文中不正确的模板实例化的硬错误转变为软错误
- 模板专用化的实例化不正确
- 为什么很清楚模板函数实例化不会内联
- 初始化不正确的价值不良样式后,正在抛出异常
- 为什么这些函数模板中的任何一个都与实例化不匹配?
- 模板实例化不"do inheritance"
- Wykobi -错误:显式实例化不能使用' inline '说明符[-fpermissive]