在C++中,为什么不能将a char**作为参数传递给接受的函数const char**,当转换为char*to时const char*,如下所示
void f1(const char** a)
{
}
void f2(const char* b)
{
}
int main(int argc, char const *argv[])
{
char* c;
f1(&c); // doesn't work
f2(c); //works
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译器输出是
test.cpp: In function 'int main(int, const char**)': test.cpp:15:10: error: invalid conversion from 'char**' to 'const char**' [-fpermissive] test.cpp:1:6: error: initializing argument 1 of 'void f1(const char**)' [-fpermissive]
要求是我需要搜索向量以查看它是否包含作为参数传入的值.如果值存在于向量中,则返回向量.否则,我返回一个空矢量.我不知道如何在c ++中返回一个空向量.希望你能帮助我.我的mimic.h:
vector<Pair> map;
Run Code Online (Sandbox Code Playgroud)
我的Pair.h:
Pair(){
}
~Pair(){}
string prefix;
vector<string> sufix;
Run Code Online (Sandbox Code Playgroud)
返回向量函数:
vector<string> Mimic::getSuffixList(string prefix){
int find=0;
for(int i =0; i < map.size(); i++)
{
if(map[i].prefix == prefix)
{
find =1;
return map[i].sufix; //sufix is a vector from a class called "Pair.h"
}
}
if(find==0)
{
//return an empty vector.
}
}
Run Code Online (Sandbox Code Playgroud) 这是一个两部分问题.可以将函数的返回值赋给引用吗?如
Foo FuncBar()
{
return Foo();
}
// some where else
Foo &myFoo = FuncBar();
Run Code Online (Sandbox Code Playgroud)
这个可以吗?我的理解是FuncBar()返回一个Foo对象,现在myFoo是对它的引用.
问题的第二部分.这是优化吗?因此,如果你在一个循环中这样做很多时候做得更好
Foo &myFoo = FuncBar();
Run Code Online (Sandbox Code Playgroud)
要么
Foo myFoo = FuncBar();
Run Code Online (Sandbox Code Playgroud)
并且考虑到变量的使用,不会使用ref需要更慢的解引用?
考虑以下:
在Xh:
class X
{
X();
virtual ~X();
};
Run Code Online (Sandbox Code Playgroud)
X.cpp:
#include "X.h"
X::X()
{}
Run Code Online (Sandbox Code Playgroud)
尝试构建这个(我使用的是.dll目标,以避免在丢失的main上出现错误,我正在使用Visual Studio 2010):
错误1错误LNK2001:未解析的外部符号"private:virtual __thiscall X :: ~X(void)"(?? 1X @@ EAE @ XZ)
然而,小的修改导致成功构建:
XH:
class X
{
inline X(); // Now inlined, and everything builds
virtual ~X();
};
Run Code Online (Sandbox Code Playgroud)
要么
XH:
class X
{
X();
~X(); // No longer virtual, and everything builds
};
Run Code Online (Sandbox Code Playgroud)
当.dtor是虚拟的或者.ctor没有内联时,是什么导致链接器中未解析的外部?
编辑:
或者,或许更有趣的是,如果我将析构函数设置为非虚拟,或者如果我内联构造函数,为什么我没有得到未解析的外部?
我正在研究一种通用的非侵入式智能指针实现.我在第4节中有些困惑.一个声明是
仅当结果类型是多态类类型的左值时,才计算作为typeid运算符的参数提供的表达式.
相关的示例代码是:
template<typename T>
void* startOfObject(T* p) {
void* q=static_cast<void*>(p);
typeid(q=dynamic_cast<void*>(p),*p); // This line
return q;
}
Run Code Online (Sandbox Code Playgroud)
AFAIU,它意味着q=dynamic_cast<void*>(p)如果结果类型是多态类类型的左值,则将对其进行评估.该结果意味着评价的结果dynamic_cast<void*>(p)(我想),所以dynamic_cast在任何情况下被应用.文章陈述(据我所知),如果p不是多态的话dynamic_cast就不会应用,但为什么呢?在应用它之前,如何知道结果是否是多态的?如果有人详细描述了如何执行完整的语句,将会很有帮助.
另一种说法是
如果p为NULL也存在问题 - typeid将抛出std :: bad cast.
我看到的问题是取消引用,如果p是NULL,而不是typeid(虽然它可能抛出bad_typeid,但这不是因为转换).dynamic_cast会返回一个NULL类型的指针void*,如果p是NULL,而且typeid应该能够推断出类型的信息.这是一个错字,还是我错过了什么?
我知道多继承的内存布局没有定义,所以我不应该依赖它.但是,我可以在特殊情况下依赖它.也就是说,一个班级只有一个"真正的"超级班级.所有其他都是"空类",即既没有字段也没有虚拟方法的类(即它们只有非虚方法).在这种情况下,这些附加类不应该向类的内存布局添加任何内容.(更简洁地说,在C++ 11中,该类具有标准布局)
我可以推断出所有超类都没有偏移吗?例如:
#include <iostream>
class X{
int a;
int b;
};
class I{};
class J{};
class Y : public I, public X, public J{};
int main(){
Y* y = new Y();
X* x = y;
I* i = y;
J* j = y;
std::cout << sizeof(Y) << std::endl
<< y << std::endl
<< x << std::endl
<< i << std::endl
<< j << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
这里,Y类X是唯一真正的基类.程序的输出(在linux上用g ++ 4.6编译时)如下:
8
0x233f010
0x233f010
0x233f010
0x233f010 …
错误MSB4018:"VCMessage"任务意外失败.System.FormatException:索引(从零开始)必须大于或等于零且小于参数列表的大小.在System.Text.StringBuilder.AppendFormat(IFormatProvider提供程序,String格式,Object [] args)处于System.String.Format(IFormatProvider提供程序,String格式,Object [] args),位于Microsoft.Build.Shared.ResourceUtilities.FormatString(String在Microsoft.Build的Microsoft.Build.Utilities.TaskLoggingHelper.FormatResourceString(String resourceName,Object [] args)的Microsoft.Build.Utilities.TaskLoggingHelper.FormatString(String unformatted,Object [] args)中未格式化,Object [] args). Microsoft.Build上的Microsoft.Build.BackEnd.TaskExecutionHost.Microsoft.Build.BackEnd.ITaskExecutionHost.Execute()中的Microsoft.Build.CPPTasks.VCMessage.Execute()上的Utilities.TaskLoggingHelper.LogWarningWithCodeFromResources(String messageResourceName,Object [] messageArgs) .BackEnd.TaskBuilder.ExecuteInstantiatedTask(ITaskExecutionHost taskExecutionHost,TaskLoggingContext taskLoggingContext,TaskHost taskHost,ItemBucket bucket,TaskExecutionMode howToExecuteTask,Boolean&taskResult)C:\ Program Files(x86 )\ MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppBuild.targets 990 6 vtk_minimal
我在这里遇到困难,是否有正确的方法来检查是否XmlSchemaParticle是一个EmptyParticle?
XmlSchemaParticle.EmptyParticle似乎是一个私人的内部阶级XmlSchemaParticle.
我现在正在做的是particle.GetType().Name == "EmptyParticle",我发现它相当难看.
还有其他选择吗?
说我有以下课程:
template<class T>
struct A
{
static int value;
};
template<class T>
int A<T>::value = 0;
Run Code Online (Sandbox Code Playgroud)
我可以专注A::value于一个没有问题的具体类型:
struct B
{
};
template<>
int A<B>::value = 1;
Run Code Online (Sandbox Code Playgroud)
我想在模板类型上专门化A ::值,我尝试了以下方法:
template<class T>
struct C
{
};
// error: template definition of non-template 'int A<C<T> >::value'
template<>
template<class T>
int A<C<T> >::value = 2;
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点,或者只能在非模板类型上专门化A ::值?
我即将为赛车编写程序,创建一个txt并不断添加新的线条.不幸的是我无法关闭文件,因为当汽车关闭覆盆子(程序正在运行)时也会关闭.所以我没有机会关闭txt.
这是一个问题吗?