小编Dav*_*ams的帖子

奇怪的GCC编译错误(包括简单示例)

这是一个非常基本的问题,但我不明白为什么下面的代码不能在GCC 4.6.1上编译.它在VS 2008 SP1上编译:

#include <iostream>

class MyClass
{
public:
    const static int MinValue = -1000;
    const static int MaxValue = 1000;
};

void printValue(int i)
{
  std::cout << i << std::endl;
}

int main(int argc, char** argv)
{
  printValue(MyClass::MinValue);
  printValue(MyClass::MaxValue);
  printValue(argc < 42 ? MyClass::MinValue : MyClass::MaxValue); //This line gives the error
}
Run Code Online (Sandbox Code Playgroud)

GCC说:

david@David-Laptop:~/temp$ g++ test.cpp
/tmp/ccN2b95G.o: In function `main':
test.cpp:(.text+0x54): undefined reference to `MyClass::MinValue'
test.cpp:(.text+0x5c): undefined reference to `MyClass::MaxValue'
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

但是,如果我取出第三次调用'printValue',那么它会构建并正常运行.所以它与'?'有关 operator …

c++ gcc compiler-errors

19
推荐指数
2
解决办法
479
查看次数

函数/仿函数作为模板参数.他们可以存储吗?

想象一下,我有以下免费功能和仿函数:

void myFreeFunction(void)
{
    cout << "Executing free function" << endl;
}

struct MyFunctor
{
    void operator()(void)
    {
        cout << "Executing functor" << endl;
    }
};
Run Code Online (Sandbox Code Playgroud)

正如这个答案所描述的,我可以将我的函数或仿函数作为模板参数传递给另一个函数:

template <typename F>
void doOperation(F f)
{
    f();
}
Run Code Online (Sandbox Code Playgroud)

然后打电话:

doOperation(myFreeFunction);
doOperation(MyFunctor());
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.但是,如果我想要以下内容:

template<typename Callback>
class MyClass
{
private:
    Callback mCallback;

public:
    MyClass(){}

    void execute()
    {
        mCallback();
    }
};
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我在声明类时指定函数/函子,但是直到稍后才调用它.它适用于仿函数:

MyClass<MyFunctor> myClass1;
myClass1.execute();
Run Code Online (Sandbox Code Playgroud)

但不适用于功能:

MyClass<myFreeFunction> myClass2;
myClass2.execute();
Run Code Online (Sandbox Code Playgroud)

编译说:

错误C2923:'MyClass':'myFreeFunction'不是参数'Callback'的有效模板类型参数

这是公平的......但你会如何构建这个?

注意:我知道std :: function并且最终可能会使用它.它虽然速度慢得多,但我正在考虑所有选择.

谢谢,

大卫

c++ templates callback

7
推荐指数
1
解决办法
1万
查看次数

为什么有两个std :: sort实现(有和没有比较器)而不是一个带有默认模板参数的实现?

在我的代码中,我采用的设计策略类似于一些标准库算法,因为确切的行为可以由函数对象定制.最简单的例子是std :: sort,其中函数对象可以控制如何在对象之间进行比较.

我注意到Visual C++提供了std :: sort的两个实现,这自然涉及代码重复.我本以为可能只有一个实现,并提供默认比较器(使用operator <)作为默认模板参数.

两个独立版本背后的理性是什么?我的建议会以某种方式使界面更复杂吗?或者当对象不提供运算符<?时导致混淆错误消息 或者它可能只是不起作用?

谢谢,

大卫

c++ parameters templates stl default

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

如何重载自定义类型的“ as”运算符?

我有两个简单的类,分别代表四个int和四个float。我想重载“ as”运算符,以便我可以轻松地将一个转换为另一个。这应该通过分别转换每个元素来完成。到目前为止,我有:

#[derive(Copy, Clone)]
pub struct i32x4 {
    pub x: i32,
    pub y: i32,
    pub z: i32,
    pub w: i32
}

#[derive(Copy, Clone)]
pub struct f32x4 {
    pub x: f32,
    pub y: f32,
    pub z: f32,
    pub w: f32
}

impl f32x4 {    
    pub fn as_i32x4(&mut self) -> i32x4 {
        i32x4{x: self.x as i32, y: self.y as i32, z: self.z as i32, w: self.w as i32}
    }
}
Run Code Online (Sandbox Code Playgroud)

这可以让我做:

let mut f = f32x4{x: 0.0, y: 0.0, z: 0.0, w: …
Run Code Online (Sandbox Code Playgroud)

casting rust

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

标签 统计

c++ ×3

templates ×2

callback ×1

casting ×1

compiler-errors ×1

default ×1

gcc ×1

parameters ×1

rust ×1

stl ×1