这是一个非常基本的问题,但我不明白为什么下面的代码不能在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 …
想象一下,我有以下免费功能和仿函数:
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并且最终可能会使用它.它虽然速度慢得多,但我正在考虑所有选择.
谢谢,
大卫
在我的代码中,我采用的设计策略类似于一些标准库算法,因为确切的行为可以由函数对象定制.最简单的例子是std :: sort,其中函数对象可以控制如何在对象之间进行比较.
我注意到Visual C++提供了std :: sort的两个实现,这自然涉及代码重复.我本以为可能只有一个实现,并提供默认比较器(使用operator <)作为默认模板参数.
两个独立版本背后的理性是什么?我的建议会以某种方式使界面更复杂吗?或者当对象不提供运算符<?时导致混淆错误消息 或者它可能只是不起作用?
谢谢,
大卫
我有两个简单的类,分别代表四个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)