namespace M{
void f();
void M::f(){}
}
int main(){}
Run Code Online (Sandbox Code Playgroud)
上面的代码给出了如下错误:
"ComeauTest.c",第3行:错误:名称空间成员声明中不允许使用限定名称void M :: f(){}
和
G ++也会出错.
但
VS2010编译好.
我的问题是:
a)预期的行为是什么?
b)$ 7.3.1.2似乎没有谈到这个限制.标准的哪一部分指导此类代码的行为?
我有一个程序,它的许多类都有一些带有关键字const的运算符和方法,如下所示:
operator const char* () const;
operator char* ();
void Save(const char *name) const;
void Load(const char *name);
Run Code Online (Sandbox Code Playgroud)
第一:在方法声明结束时它是什么意思?是什么意思就像把它放在开头一样?
第二:为什么需要const版本和不需要const版本的operator()?
提前致谢.
我的课程是多态的,不应该被用来做任何事情.它有一个Font&类型的成员,因此编译器不能生成=运算符.所以我刚刚创建了赋值和复制构造函数的虚拟实现,将它们放在类的私有中,但它仍然警告我,无法生成赋值运算符.我怎么能摆脱这个警告?
谢谢
警告9警告C4512:'AguiWidget':无法生成赋值运算符c:\ users\josh\documents\visual studio 2008\projects\agui\alleg_5\agui\aguiwidget.hpp 250
是什么决定两个函数模板声明是声明相同的模板,还是相同名称的重载?
答案的开头是在3.5p9中找到的:
如果两个名称相同(第3条)并且在不同范围中声明,则它们应表示相同的变量,函数,类型,枚举器,模板或名称空间(如果
两个名称都具有外部链接,或者两个名称都具有内部链接,并且在同一翻译单元中声明;和
这两个名称都引用相同名称空间的成员,或者引用同一类的成员,而不是通过继承。和
当两个名称都表示函数时,这些函数的参数类型列表(8.3.5)相同;和
当两个名称都表示功能模板时,签名(14.5.6.1)相同。
非模板非成员函数的签名为(1.3.17):
签名
<功能>名称,参数类型列表(8.3.5)和封闭的名称空间(如果有)
[ 注意:签名用作名称处理和链接的基础。- 尾注 ]
在8.3.5p5节中已经定义了两次提到的parameter-type-list。本段描述了如何从声明的类型调整函数参数的实际类型,如何用指针替换数组和函数,以及如何舍弃顶级cv-qualifiers。然后,
转换后的参数类型以及省略号或功能参数包的存在或不存在的结果列表就是函数的parameter-type-list。
因此,在非模板的情况下,parameter-type-list显然是类型的概念性语义列表(可能还有一个奇特的结尾),而不是标记序列或语法构造。正如我们所期望的,以下内容违反了ODR,因为这两个定义定义了相同的功能:
void f(int, int*) {}
void f(int p, decltype(p)*) {}
Run Code Online (Sandbox Code Playgroud)
在模板的情况下,我们有(1.3.18):
签名
<功能模板>名称,参数类型列表(8.3.5),封闭的名称空间(如果有),返回类型和模板参数列表
现在考虑:
template<typename T> void g(int, int*, T, T*) {} // #1
// template<typename T> void g(int p, decltype(p)*, T, T*) {} // #2
template<typename T> void g(int, int*, T q, decltype(q)*) {} // #3
Run Code Online (Sandbox Code Playgroud)
g ++ -std = c ++ 0x版本4.6.3抱怨定义#1和#2定义了相同的函数,但是毫无疑问接受#1和#3作为重载。(它也认为#3比#1更专业,并且没有办法调用#1,但这是一个切线的问题。)#2和#3之间的主要区别在于q …
有什么办法可以得到这样的行为?
// Some definition(s) of operator "" _my_str
// Some definition of function or macro MY_STR_LEN
using T1 = MY_STR_LEN("ape"_my_str);
// T1 is std::integral_constant<std::size_t, 3U>.
using T2 = MY_STR_LEN("aardvark"_my_str);
// T2 is std::integral_constant<std::size_t, 8U>.
Run Code Online (Sandbox Code Playgroud)
似乎不是,因为字符串文字会立即传递some_return_type operator "" _my_str(const char*, std::size_t);给文字运算符模板,而不会传递给文字运算符模板(2.14.8 / 5)。即使几乎总是一个常量表达式,该size函数参数也不能用作模板参数。
但是似乎应该有某种方法可以做到这一点。
考虑以下代码:
struct Foo {
float f;
Foo& operator+=(Foo rhs) {
Foo operator+(Foo, Foo);
*this = *this + rhs;
return *this;
}
};
inline Foo operator+(Foo lhs, Foo rhs) {
return Foo{lhs.f + rhs.f};
}
Run Code Online (Sandbox Code Playgroud)
当且仅当operator+(Foo, Foo)定义为 时inline,GCC 和 MSVC 会给出“未定义对 operator+(Foo, Foo) 的引用”链接器错误,而 Clang 没有问题。请参阅此处以获取实时示例。
我认为这段代码是有效的;inline函数的-ness 应该没有任何影响,因为函数不需要像inline定义为那样声明inline(无论如何,函数不能inline在块范围内声明)。
请注意,如果在 的定义之前operator+(Foo, Foo)改为声明(为非inline)Foo,则所有 3 个编译器都接受它。
但是,标准中的诸如链接之类的问题很棘手,所以我知道它也可能是未定义的行为或“格式错误,无需诊断”,而 GCC 和 MSVC 恰好会出错。
那么这个代码有效吗?哪个编译器是正确的?
迭代时std::map<X,std::vector<Y> >,我可以对向量进行排序,还是可能使迭代器无效?
换句话说,以下代码是否可以?
typedef std::map<int, std::vector<int> > Map;
Map m;
for (Map::iterator it = m.begin(); it != m.end(); ++it) {
std::sort(it->second.begin(), it->second.end());
}
Run Code Online (Sandbox Code Playgroud) 我有这个构造函数抛出异常
GenericSocket::GenericSocket(const string& hostname,
const string& servname):
_hostname(hostname),
_servname(servname)
{
initHints();
int rv;
if((rv = getaddrinfo(_hostname.c_str(),
_servname.c_str(),
&_hints,
&_servinfo)) != 0) {
throw GenericSocketException();
}
}
Run Code Online (Sandbox Code Playgroud)
initHints()执行_hints的memset并设置一些变量.
我用google测试框架测试它,如下所示:
TEST(CreateObject2, getaddrinfoException)
{
mgs_addrinfo_return = 1;
ASSERT_THROW(new GenericSocket("testhost", "4242"), GenericSocketException);
}
Run Code Online (Sandbox Code Playgroud)
测试因核心转储失败:
[ RUN ] CreateObject2.getaddrinfoException
socket creation failed
terminate called after throwing an instance of 'common::GenericSocketException'
what(): Socket creation failed
[1] 43360 abort (core dumped) ./bin/test_common
Run Code Online (Sandbox Code Playgroud)
除了我不知道到底出了什么问题的事实,我怀疑一些未初始化的对象被删除(?),很多似乎发生在幕后,所以我开始怀疑在构造函数中抛出异常是否是好习惯.是否可以更好地将此功能放在另一个我可以在创建对象后调用的函数中,然后处理异常?
请有人解释一下:
如果文档说STL std :: vector find element performace = O(ln(n)),那是什么意思.
O(ln(n))- 什么是" O ",在哪里我可以读到这个?
在那里我可以阅读其他STL容器性能的性能
非常感谢你
仅在链接优化的目标文件时,而不是在链接未优化的目标文件时,我才会收到未定义的引用链接器错误。我不明白问题是什么或可能是什么。
这是我未优化的构建:
构建文件:../COMPASS.cpp 调用:GCC C++ 编译器 g++ -O0 -g3 -pg -Wall -c -fmessage-length=0 -Wno-sign-compare -fopenmp -MMD -MP -MF"COMPASS.d" -MT"COMPASS.d" -o"COMPASS.o" “../COMPASS.cpp” 完成的建筑:../COMPASS.cpp 构建文件:../PSA.cpp 调用:GCC C++ 编译器 g++ -O0 -g3 -pg -Wall -c -fmessage-length=0 -Wno-sign-compare -fopenmp -MMD -MP -MF"PSA.d" -MT"PSA.d" -o"PSA.o" “../PSA.cpp” 完成的建筑:../PSA.cpp 构建文件:../SAR.cpp 调用:GCC C++ 编译器 g++ -O0 -g3 -pg -Wall -c -fmessage-length=0 -Wno-sign-compare -fopenmp -MMD -MP -MF"SAR.d" -MT"SAR.d" -o"SAR.o" “../SAR.cpp” 完成的建筑:../SAR.cpp 构建文件:../constraints.cpp 调用:GCC C++ 编译器 g++ -O0 -g3 -pg -Wall -c -fmessage-length=0 -Wno-sign-compare -fopenmp …
c++ ×9
stl ×2
big-o ×1
c++11 ×1
constructor ×1
definition ×1
googletest ×1
iterator ×1
linker ×1
map ×1
member ×1
namespaces ×1
performance ×1
templates ×1
warnings ×1