Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我可以使用模板设置数组大小吗?_C++ - Fatal编程技术网

C++ 我可以使用模板设置数组大小吗?

C++ 我可以使用模板设置数组大小吗?,c++,C++,所以,我不熟悉使用模板,我有一个问题。由于模板是在编译时处理的,数组大小必须在编译时设置,我可以使用模板来设置数组大小吗 template<const size_t N> struct Stats { // Member functions (omitted). // The stats themselves. int stats[N]; }; class DudeWithStats { public: void setStats(

所以,我不熟悉使用模板,我有一个问题。由于模板是在编译时处理的,数组大小必须在编译时设置,我可以使用模板来设置数组大小吗

template<const size_t N> struct Stats {
    // Member functions (omitted).

    // The stats themselves.
    int stats[N];
};

class DudeWithStats {
    public:
        void setStats(int sts[], size_t sz, bool derived = false);

        // Other member functions (omitted).

    private:
        Stats<8> base;
        Stats<5> derived;

        // Other member variables (omitted).
};

void DudeWithStats::setStats(int sts[], size_t sz, bool drvd /* = false */) {
    for (int i = 0; i < sz; i++) {
        if (drvd) {
            derived.stats[i] = sts[i];
        } else {
            base.stats[i] = sts[i];
        }
    }
}

int main() {
    int arrBase[8] = { 10, 20, 10, 10, 30, 10, 15, 6 };
    int arrDerived[5] = { 34, 29, 42, 100, 3 };

    DudeWithStats example;
    example.setStats(arrBase, 8);
    example.setStats(arrDerived, 5, true);
}
模板结构统计信息{
//成员函数(省略)。
//统计数据本身。
int stats[N];
};
阶级与国家{
公众:
无效设置状态(int sts[],size_t sz,bool-derived=false);
//其他成员函数(省略)。
私人:
统计基础;
统计数据来源;
//其他成员变量(省略)。
};
无效状态::设置状态(int sts[],size_t sz,bool drvd/*=false*/){
对于(int i=0;i
我可以看到用
new
std::vector
创建一个动态数组是可行的,但我很好奇这是否可行

(是的,我知道
const
在模板声明中是毫无意义的,至少对编译器来说是这样。它主要用于文档编制。)

提前谢谢

(编辑:注意到我在setStats()的定义中有默认参数。修复了它。我相信也修复了函数本身(以前从未直接复制过数组)。)

(编辑:将其切换为大小。仍在努力使setStats()正常工作,我可能会坚持手动传递统计数据,而不是作为数组。)

(编辑:只是使用了一种变通方法使setStats()正常工作。它看起来有点笨拙,但对于测试代码来说已经足够好了。)



谢谢大家的回答和帮助。我将使用类似的东西来满足我的需要,并随着我在编码方面的进步对其进行改进。

关于模板的内容,你是完全正确的。模板(可能太)灵活,系统(IMHO)只能由Haskell比较

无论如何,GCC不会喜欢您的代码:

c.cpp:21:57: error: default argument given for parameter 2 of ‘void DudeWithStats::setStats(int*, bool)’ [-fpermissive]
 void DudeWithStats::setStats(int* sts, bool drvd = false) {
                                                         ^
c.cpp:10:14: error: after previous specification in ‘void DudeWithStats::setStats(int*, bool)’ [-fpermissive]
     void setStats(int* stats, bool derived = false);
          ^
默认参数只给出一次,如果将其从定义中删除,就不会有问题

c.cpp: In member function ‘void DudeWithStats::setStats(int*, bool)’:
c.cpp:23:23: error: incompatible types in assignment of ‘int*’ to ‘int [5]’
         derived.stats = sts;
                       ^
c.cpp:25:20: error: incompatible types in assignment of ‘int*’ to ‘int [8]’
         base.stats = sts;
                    ^
谁说你的数组是可分配的?有
memcpy
new(&base.stats)
出于某种原因,不是吗

c.cpp: In function ‘int main()’:
c.cpp:34:13: error: request for member ‘setStats’ in ‘example’, which is of non-class type ‘DudeWithStats()’
     example.setStats(arrBase);
             ^
c.cpp:35:13: error: request for member ‘setStats’ in ‘example’, which is of non-class type ‘DudeWithStats()’
     example.setStats(arrDerived, true);

教程欺骗了你!你不是在声明一个变量,而是一个函数! P> > C++语法(至少从程序员的角度来看)有一个模糊不清的地方,例如“代码> DuDEFISSTATS示例”()code>的意思是“声明一个不带参数的函数(在其他地方定义),并返回一个
DudeWithStats
”,而不是“声明一个名为
example
DudeWithStats
,并默认初始化它”

对于后面的目的,使用
dudestats示例(带括号!)。而且,对于勇敢和符合标准的灵魂来说,C++11支持在
DudeWithStats示例{}中找到的这种不含糊的替代语法。这种语法确实避免了上面提到的歧义,包括解决(甚至更多)困惑

所以答案是。。。
除了这些小细节,您的代码和
模板的使用是(语法上)正确的P.D:请您使用
size\u t
而不是
unsigned const int
来改善每个人的心理健康,好吗?

关于模板的内容,您完全正确。模板(可能太)灵活,系统(IMHO)只能由Haskell比较

无论如何,GCC不会喜欢您的代码:

c.cpp:21:57: error: default argument given for parameter 2 of ‘void DudeWithStats::setStats(int*, bool)’ [-fpermissive]
 void DudeWithStats::setStats(int* sts, bool drvd = false) {
                                                         ^
c.cpp:10:14: error: after previous specification in ‘void DudeWithStats::setStats(int*, bool)’ [-fpermissive]
     void setStats(int* stats, bool derived = false);
          ^
默认参数只给出一次,如果将其从定义中删除,就不会有问题

c.cpp: In member function ‘void DudeWithStats::setStats(int*, bool)’:
c.cpp:23:23: error: incompatible types in assignment of ‘int*’ to ‘int [5]’
         derived.stats = sts;
                       ^
c.cpp:25:20: error: incompatible types in assignment of ‘int*’ to ‘int [8]’
         base.stats = sts;
                    ^
谁说你的数组是可分配的?有
memcpy
new(&base.stats)
出于某种原因,不是吗

c.cpp: In function ‘int main()’:
c.cpp:34:13: error: request for member ‘setStats’ in ‘example’, which is of non-class type ‘DudeWithStats()’
     example.setStats(arrBase);
             ^
c.cpp:35:13: error: request for member ‘setStats’ in ‘example’, which is of non-class type ‘DudeWithStats()’
     example.setStats(arrDerived, true);

教程欺骗了你!你不是在声明一个变量,而是一个函数! P> > C++语法(至少从程序员的角度来看)有一个模糊不清的地方,例如“代码> DuDEFISSTATS示例”()code>的意思是“声明一个不带参数的函数(在其他地方定义),并返回一个
DudeWithStats
”,而不是“声明一个名为
example
DudeWithStats
,并默认初始化它”

对于后面的目的,使用
dudestats示例(带括号!)。而且,对于勇敢和符合标准的灵魂来说,C++11支持在
DudeWithStats示例{}中找到的这种不含糊的替代语法。这种语法确实避免了上面提到的歧义,包括解决(甚至更多)困惑

所以答案是。。。 除了这些小细节,您的代码和
模板的使用是(语法上)正确的P.D:为了每个人的心理健康,请使用
size\u t
而不是
unsigned const int
好吗。是的,你可以

template <size_t N>
void foo()
{
   // 100% standard-compliant and fine
   bool array[N] = {};
}
模板
void foo()
{
//100%符合标准且良好
布尔数组[N]={};
}
是。是的,你可以

template <size_t N>
void foo()
{
   // 100% standard-compliant and fine
   bool array[N] = {};
}
模板
void foo()
{
//100%符合标准且良好
布尔数组[N]={};
}

尝试时发生了什么?模板参数的类型可能应该是
size\t
如果没有其他错误,它将正常工作。通常情况下,这些数组都是不同类型的,这会很快让人恼火。但是如果这不是一个问题,那么这种方法是可以的数组不可分配。如果使用
std::array stats
然后可以使用赋值运算符复制数组。尝试该操作时发生了什么?模板参数的类型可能应该是
size\t
,如果没有其他错误,它将正常工作。只是我经常