注意:我们在这里谈论(据称)符合C++ 98的编译器.这不是C++ 11的问题.
我们在其中一个编译器中有一个奇怪的行为,我们不确定这是否正常或者这是否是编译器错误:
// This struct has a default constructor
struct AAA
{
AAA() : value(0) {}
int value ;
} ;
// This struct has a member of type AAA and an array of int, both surrounded
// by ints
struct BBB
{
int m_a ;
AAA m_b ;
int m_c ;
int m_d[42] ;
} ;
Run Code Online (Sandbox Code Playgroud)
当BBB初始化时:
BBB bbb = {0} ;
Run Code Online (Sandbox Code Playgroud)
我们期望BBB的所有POD成员(包括m_d,整数数组)被零初始化,并且要构建BBB的所有非POD成员.
这适用于AIX的本机编译器,在Linux/GCC-3.4上,在Windows/VisualC++上......但不适用于Solaris/SunStudio,其中只有非数组成员被零初始化.
我们在C++ 98标准(草案文档)中进行了一些研究,在那里我们发现了以下内容:
[12.6.1 - 2]
当聚合(无论是类还是数组)包含类类型的成员并由大括号括起的初始化列表(8.5.1)初始化时,每个这样的成员都由相应的赋值表达式进行复制初始化(见8.5).如果初始化列表中的初始值设定项少于聚合的成员,则未明确初始化的每个成员都应默认初始化(8.5).
然后:
[8.5 - 5]
对 …
我们即将(在接下来的两年内)将所有编译器迁移到C++ 11-ready编译器.
我们的客户将使用我们的标题,现在我们可以为新API编写(或多或少从头开始)标题.
因此,我们必须在保持C++ 03枚举(包括所有瑕疵)之间做出选择,或者使用包装类来模拟C++ 11表示法,因为我们最终希望将这些枚举移动到C++ 11.
下面提出的"LikeEnum"成语是否是一个可行的解决方案,还是隐藏着意外的惊喜?
template<typename def, typename inner = typename def::type>
class like_enum : public def
{
typedef inner type;
inner val;
public:
like_enum() {}
like_enum(type v) : val(v) {}
operator type () const { return val; }
friend bool operator == (const like_enum & lhs, const like_enum & rhs) { return lhs.val == rhs.val; }
friend bool operator != (const like_enum & lhs, const like_enum & rhs) { return lhs.val != rhs.val; }
friend bool …Run Code Online (Sandbox Code Playgroud) 我正在浏览EASTL的列表类来查看作者如何实现节点.我的期望是一个简单的类/结构.相反,我看到一个基础和一个继承自这个基础的节点(仍然过于简单,但为什么还有两个类?).他的评论解释了原因:
我们将ListNodeBase与ListNode(下面)分开定义,因为它允许我们进行非模板化操作,例如insert,remove(下面),并且它使得列表锚节点不携带T,其中由于存在用户没有明确创建的额外Ts,会浪费空间并可能导致用户感到惊讶.所有这一切的缺点是,鉴于节点指针的类型是ListNodeBase而不是ListNode,它会使列表的调试查看更加困难.但是,请参阅下面的ListNodeBaseProxy.
我不明白这里有几件事.我做明白为什么它会使调试观看有点困难的部分,但到底是什么,他的意思是list anchor node doesn't carry a T with it和would waste space and possibly lead to surprising the user due to extra Ts existing that the user didn't explicitly create?
我有以下代码:
<html>
<head>
<style id="ID_Style">
.myStyle
{
color : #FF0000 ;
}
</style>
</head>
<body>
<p class="myStyle">
Hello World !
</p>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
我想<style>通过JavaScript 修改内容.
第一个解决方案是使用样式元素的innerHTML属性(通过其id检索),但是当它在Firefox上运行时,它在Internet Explorer 7上失败.
因此,我使用纯DOM方法,即创建一个名为style的元素,一个包含所需内容的文本节点,并将文本节点作为样式节点的子节点等附加.它也失败了.
根据MSDN,该<style>元素具有innerHTML属性,并且根据W3C,该<style>元素是HTMLStyleElement,它派生自HTMLElement,派生自从Node派生的Element,其具有appendChild方法.它似乎表现为<style>在Internet Explorer上只读取元素的内容.
所以问题是:有没有办法<style>在Internet Explorer上修改元素的内容?
虽然目前的问题在于IE7,但如果可能的话,跨浏览器解决方案会很酷.
样式元素(MSDN): http://msdn.microsoft.com/en-us/library/ms535898.aspx
HTMLStyleElement(W3C): http://www.w3.org/TR/2003/REC-DOM-Level-2-HTML-20030109/html.html#ID-16428977
如果要重现问题,可以使用此测试代码:
<html>
<head>
<style id="ID_Style">
.myStyle
{
color : #FF0000 ;
}
</style>
<script>
function replaceStyleViaDOM(p_strContent)
{
var oOld = document.getElementById("ID_Style") ;
var …Run Code Online (Sandbox Code Playgroud) 我有一个MyClass类,它是在typename T上模板化的.但是在内部,我想要一个在另一个类型TT上模板化的方法(与T无关).
阅读/修补后,我发现了以下符号:
template <typename T>
class MyClass
{
public :
template<typename TT>
void MyMethod(const TT & param) ;
} ;
Run Code Online (Sandbox Code Playgroud)
由于风格原因(我喜欢在一个头文件中使用模板化类声明,以及另一个头文件中的方法定义),我不会在类声明中定义方法.所以,我必须把它写成:
template <typename T> // this is the type of the class
template <typename TT> // this is the type of the method
void MyClass<T>::MyMethod(const TT & param)
{
// etc.
}
Run Code Online (Sandbox Code Playgroud)
我知道我必须"声明"方法中使用的类型名称,但不知道究竟是多少,并通过试验和错误找到.
上面的代码在Visual C++ 2008上编译,但是:这是在T上模板化的类中使用模板化方法的正确方法吗?
作为奖励:这种代码背后是否存在隐藏的问题/意外/限制?(我想专业化写作可能很有趣)
假设我输入一个整数或整数数组或任何已知类型:
typedef int int2
Run Code Online (Sandbox Code Playgroud)
然后我为int2对重载operator*,现在如果我将变量a和b初始化为int.那么a和b之间的*是否会超负荷*?
我如何实现重载int,并且还使用*for int的方式.我应该创建一个新类型吗?
以下c程序的输出是:0.000000输出后面是否有逻辑或者是编译器依赖的答案还是我只是得到垃圾值?
#include<stdio.h>
int main()
{
int x=10;
printf("%f", x);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
PS: - 我知道尝试使用%f打印整数值是愚蠢的.我只是从理论的角度来问这个问题.
我有以下C#类:
public class MyType<T>
{
public void TryParse(string p_value)
{
T value ;
Parser.TryParse(p_value, out value);
// Do something with value
}
}
Run Code Online (Sandbox Code Playgroud)
重点是调用正确的Parser.TryParse方法,具体取决于泛型类型T.
这使用以下静态类:
static public class Parser
{
static public void TryParse(string p_intput, out object p_output)
{
// Do something and return the right value
}
static public void TryParse(string p_intput, out double p_output)
{
// Do something and return the right value
}
static public void TryParse(string p_intput, out int p_output)
{
// Do something and return …Run Code Online (Sandbox Code Playgroud) 以下代码不能在Visual C++ 2008和2010上编译:
#include <memory>
struct A {};
std::auto_ptr<A> foo() { return std::auto_ptr<A>(new A); }
const std::auto_ptr<A> bar() { return std::auto_ptr<A>(new A); }
int main()
{
const std::auto_ptr<A> & a = foo(); // most important const
const std::auto_ptr<A> & b = bar(); // error C2558:
// class 'std::auto_ptr<_Ty>' :
// no copy constructor available or copy
// constructor is declared 'explicit'
bar(); // No error?
}
Run Code Online (Sandbox Code Playgroud)
我期望"最重要的const"应用于变量"b",然而,它不会编译,并且由于某种原因,编译器要求复制构造函数(这让我感到惊讶,因为这里不应该涉及复制) .独立调用bar()工作正常,这意味着,我猜,它实际上是初始化b的问题.
这是编译器错误,还是标准中描述的真正的编译错误?
(也许它在C++ 98中被禁止并在C++ 11中被授权?)
注意:它在Visual C++ 2012,gcc 4.6和Solaris …