小编sel*_*tze的帖子

为什么模板参数中的 cv 限定符被忽略?

我有一些代码无法编译,如下所示。经过一番挖掘后,我发现了第 14.1 段注释 5,其中指出:

确定其类型时,模板参数上的顶级 cv 限定符将被忽略。

我的代码如下所示:

#include <iostream>
#include <typeinfo>

class Bar {};

template<class T>
void Func(T t)
{
   std::cout << typeid(T).name() << "\n";
}

template<class T>
void Func(const T& t)
  {
     std::cout << "const ref : " << typeid(T).name() << "\n";
   }


 int main()
  {
    Bar bar;
    const Bar& constBar = bar;

    Func(constBar);

    return 0;
 }
Run Code Online (Sandbox Code Playgroud)

它给出了这个编译错误:

In function 'int main()'  
error: call of overloaded 'Func(const Bar&)' is ambiguous
Run Code Online (Sandbox Code Playgroud)

有人可以评论标准中这条规则背后的推理吗?

c++ templates

4
推荐指数
1
解决办法
1009
查看次数

访问被拒绝注册表

我是第一次以编程方式使用注册表,并且效果不佳(但至少我没有销毁我的计算机).具体来说,我一直在从RegCreateKeyEx和RegSetValueEx返回错误5(访问被拒绝).对我来说最奇怪的是,当HKEY_CURRENT_USER\Software\dir1\Sub Directory已经存在时,RegCreateKeyEx以错误5失败,但是当它尚不存在时,它会成功创建它; 然后在RegSetValueEx上失败.

我在这段代码中做错了吗?

BOOL MyDialog::SaveLocationsToRegistry()
{
    HKEY   hkey;
    DWORD  dwDisposition;
    DWORD dwType, dwSize;
    LONG result = RegCreateKeyEx(HKEY_CURRENT_USER, TEXT("Software\\dir1\\Sub Directory"), 
                                 0, NULL, 0, 0, NULL, &hkey, &dwDisposition);
    if(result == ERROR_SUCCESS)
    {
        LPCTSTR szLastFolder = "C:\\Documents and Settings\\user\\My Documents\\Copy of item\0";
        dwType = REG_SZ;
        dwSize = strlen(szLastFolder)+1;
        LONG setResult = RegSetValueEx(hkey, TEXT("LastFolder"), 0, dwType, 
        (PBYTE)&szLastFolder, dwSize);
        RegCloseKey(hkey);
        return setResult == ERROR_SUCCESS;
    }
    else
    {
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:绝对路径仅暂时存在.宝贝步骤;-)

c++ registry debugging winapi

3
推荐指数
1
解决办法
5222
查看次数

在gcc和visual c ++中使用'>>'

我们正在编写一个使用gcc和Visual C++编译的应用程序.一些团队成员只使用Visual C++/Windows,而其他人只使用gcc/linux.由于编译器之间的差异,构建有时会中断.我已经"修复"了几个导致使用编译器选项来启用/禁用警告的构建中断的场景,但是目前我仍然坚持使用C++模板中使用的">>".

Visual Studio似乎单方面扩展了标准,将">>"包含在模板中作为有效表达式(这仅在建议的C++ 0x中有效).但是gcc不接受这个作为有效的模板.现在我无法在Visual Studio中找到一个选项来禁止">>"或在gcc中禁用">>".我该怎么办?

注意:这个问题是关于双角支架,而不是右移操作员.

c++ gcc visual-c++

1
推荐指数
2
解决办法
694
查看次数

rvalues c ++ 0x并移动到堆

好吧,我一直在读rvalues,它们似乎是一个好主意,但有些东西一直困扰着我.特别是移动的主张允许我们窃取资源并避免复制.

我理解移动是有效的,并且确实避免复制堆栈上发生的所有事情,但最终在堆栈上完成的大部分内容会产生一些我们想要复制到堆中的值,这是我认为移动不起作用的地方.

假设int有一个移动赋值运算符,给定以下代码:

struct Foo
{
int x;
};

void doIt()
{
Foo* f = new Foo();
f->x = (2 + 4);
}
Run Code Online (Sandbox Code Playgroud)

因此,在这个例子中,由(2 + 4)得到的rvalue可以推移到f-> x而不是复制.好,太棒了.但是f和f-因此f-> x在堆上并且rvalue在堆栈上.似乎无法避免副本.你不能简单地将f-> x指向rvalue的内存.一旦它结束,那个右值就会被吹走.副本似乎是必要的.

我是对的,我会做一个副本吗?还是我错了?或者我是否完全误解了右值概念?

c++11

0
推荐指数
1
解决办法
298
查看次数

E0308具有简单通用功能的不匹配类型

我是Rust的新手,我正在尝试编写自己的简单泛型函数.

fn templ_sum<T>(x : T, y : T) -> T
    where T : std::ops::Add
{
    let res : T = x + y;
    res
}

fn main()
{
    let x : f32 = 1.0;
    let y : f32 = 2.0;
    let z = templ_sum(x, y);
    println!("{}", z);
}
Run Code Online (Sandbox Code Playgroud)

但编译失败的消息

错误:不匹配的类型:expected T,found <T as core::ops::Add>::Output(期望的类型参数,找到的关联类型)[E0308] main.rs:12让res:T = x + y;

我有点困惑.谁能向我解释我做错了什么?

rustc --version:rustc 1.2.0(082e47636 2015-08-03)

generics rust

0
推荐指数
1
解决办法
374
查看次数

标签 统计

c++ ×3

c++11 ×1

debugging ×1

gcc ×1

generics ×1

registry ×1

rust ×1

templates ×1

visual-c++ ×1

winapi ×1