我有一个枚举值作为一个类的成员,我想作为模板参数传递?编译器抱怨该成员不能用于常量表达式.这项工作有什么神奇之处吗?
我目前的解决方案是一个switch-case语句,但在我的原始代码中EType有近200个条目.所以我最初的想法是编写一个type_traits,用于将枚举值映射到类型.
这是我的问题的一个例子(也在ideone.com上)(问题是最后一行main()):
#include <iostream>
enum EType
{
eType_A,
eType_B,
eType_C
};
struct Foo
{
Foo(EType eType)
: m_eType(eType)
{
}
EType m_eType;
};
template <EType eType>
struct Bar
{
static std::string const toString()
{
return "-";
}
};
template <>
struct Bar<eType_A>
{
static std::string const toString()
{
return "A";
}
};
template <>
struct Bar<eType_B>
{
static std::string const toString()
{
return "B";
}
};
int main(int argc, char *argv[])
{
std::cout …Run Code Online (Sandbox Code Playgroud) 我尝试了一些代码来检查数组和指针的行为.其内容如下.
#include <stdio.h>
main(){
int s[]={1,2};
int *b=s;
printf("%d, %d, %d\n", s, &s, *s);
printf("%d, %d, %d\n", b ,&b, *b);
}
Run Code Online (Sandbox Code Playgroud)
最初我认为指针和数组是相同的但是......
令我惊讶的是,'s'和'&s'的值与'b'不同.这是否意味着一个数组变量"指向自己?"
我现在也对变量"名称"实际上是什么感到困惑?如何与内存中的位置进行绑定?我只是无法想象那里发生的事情!内存(RAM)中的所有信息都是在运行时存储的?
如果我想删除动态分配的基本类型值数组:
int *it = new int[10]
我是否只是放入delete [] it析构函数来正确释放内存?
要么
意识到,作为指针是基本类型,删除动态分配的数组会涉及在析构函数中执行类似的操作:
for (size_t idx = 0; idx != 5; ++idx)
delete sp[idx];
delete[] sp;
Run Code Online (Sandbox Code Playgroud)
我对此感到困惑,因为我的程序中存在大量与内存相关的错误.
我在我的项目中使用预编译的头文件.precompile.h包括我创建的*.h文件和来自我从未重建的库中的许多*.h文件.
我的问题是,每次编辑我的一个*.h文件时,它都会编译整个precompile.h文件.这大约需要5分钟.(仅编辑cpp文件后编译只需1秒钟.)
我知道这是预编译头文件的工作方式,但无论如何要分离我的头文件,以便编译器只编译我的文件?
我有一个带有Cell类对象的stl集
class Cell
{
public:
//Ctor/Dtor
Cell(size_t cellId=0,int x =0,int y = 0,size_t t = 0):m_cellId(cellId),m_x(x),m_y(y),m_t(t),m_color(WHITE),m_pCellId(0),m_regNum(0){}
////////////////////
// Mutators //
////////////////////
void schedNode(size_t t,int nodeId){m_sched[t] = nodeId;}
void setColor(color c){m_color = c;}
void setParentId(size_t pId){m_pCellId = pId;}
//.....
}
Run Code Online (Sandbox Code Playgroud)
每个Cell都有m_x和m_y(成员)坐标+其他数据成员(m_t,m_color,m_pCellId,m_regNum)
comapareCells类仅用于根据实际的m_x和m_y坐标查找单元格:
class comapareCells
{
public:
bool operator()(const Cell& lCell,const Cell& rCell)
{
if(lCell.getX() < rCell.getX())
return true;
else if(lCell.getX() == rCell.getX())
return (lCell.getY() < rCell.getY());
else
return false;
}
};
Run Code Online (Sandbox Code Playgroud)
我运行以下命令以找到"实际单元格":
c …
以下是我现在可以构建的最佳"最小工作示例".我想了解以下代码是否泄漏了内存.
// Class CTest
class CTest {
vector<int> Elements;
CTest (vector<int>&);
~CTest ();
};
CTest::CTest (vector<int>& Elements_) {
this->Elements = Elements_;
}
CTest::~CTest () {
}
// main
int main (int argc, char *argv[]) {
vector<CTest> V;
for (auto i = 0; i < 10; i++) {
vector<int> U;
for (auto j = i; j < i + 5; j++) U.push_back (j);
V.push_back (*(new CTest (U)));
}
// Do whatever
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我是否正确地认为,由于delete每次调用都没有相应的调用new,这个程序确实泄漏了内存?
所以我在C中乱用Bit-Twiddling,我遇到了一个有趣的输出:
int main()
{
int a = 0x00FF00FF;
int b = 0xFFFF0000;
int res = (~b & a);
printf("%.8X\n", (res << 8) | (b >> 24));
}
Run Code Online (Sandbox Code Playgroud)
此声明的输出是:
FFFFFFFF
我期待输出
0000FFFF
但为什么不是呢?我在这里错过了一些比特移位的东西吗?
我在多选模式下有一个列表框,它是数据绑定的数据库中的15个值.我有这段代码来显示列表框中选中的每个项目的选定值:
foreach (var list in list_box.SelectedItems)
{
MessageBox.Show(list_box.SelectedValue.ToString());
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,显示了正确数量的消息框,但它们仅显示已选择的列表中第一个项目的选定值.
有人可以帮我解决这个问题吗?我一直在网上搜索,但我找不到一个正常工作的例子!
我需要一些帮助,找到并使用一个好的调试器,用于在64位Linux上与yasm组装的asm代码.gdb调试器一直抱怨没有加载符号表.stackoverflow上有人建议使用-dstabs开关组装,但这对我来说没有任何区别.ddd也没有什么不同.
如果我能找到摆脱"无符号表加载"问题的方法,gdb就不会那么糟糕.我还需要能够查看寄存器和其他声明的内容.
我使用yasm -f elf -m amd64 file.asm和我链接来组装我的asm文件ld file.o -o file.使用-l开关使用yasm创建.lst文件似乎也不起作用.
我发现的关于这个问题的所有建议似乎与使用gcc作为链接器而不是ld有关.我需要能够与ld链接.
我不是一个JavaScript大师,所以我需要一个简单的代码帮助.我有一个清除输入字段值的按钮.
如果输入字段为空,我希望隐藏它(按钮),反之亦然(如果输入字段中有文本,则可见).
解决方案可以是纯JavaScript或jQuery,也没关系.越简单越好.