【发布时间】:2018-03-25 21:02:29
【问题描述】:
在下面的示例中,尽管我知道已知的执行路径将是“安全的”,但我在编译它时遇到了问题。 “安全”是指我知道我只会以这种方式使用它。有没有一种算法或更好的方法来构建一个场景,即使我知道我永远不会有一个“类型”的“浮点”传递一个“种类”值为 1?
我得到的特别错误是
error C2248: 'foo::foo' : cannot access private member declared in class 'foo'
测试用例示例
#include <vector>
using namespace std;
class foo {
private:
foo(float val) {
val = 99.0f;
}
public:
foo(int val) {
val = 2;
}
};
template<typename Type>
struct bar {
public:
vector<Type> array;
void Add(Type value) {
array.push_back(value);
}
};
class bunny {
bar<float> floats;
bar<foo> foos;
public:
template<typename Type>
void Initialize(int kind, Type value) {
if(kind == 0)
floats.Add(value);
else if(kind == 1)
foos.Add(value);
}
};
int main(void) {
bunny first; first.Initialize(0, 1.0f);
//bunny second; second.Initialize(1, 0);
return 0;
}
【问题讨论】:
-
有一个关键字
friend可能对你有帮助。 -
我假设您故意将 foo(float) 构造函数设为私有以测试编译器是否使用它?无论如何,我认为您可以使用 Initialize() 方法的专业化来做您想做的事情。
-
@JorgeGonzálezLorenzo 我从未听说过诸如 Initialize() 方法的“专业化”之类的东西。那该怎么做呢?
-
kind参数的用途是什么?如果它只是说明你有什么类型的value,那么有更好的方法(使用类型系统)来做到这一点。 -
在上面的代码中,我认为根本不需要
kind。我可以告诉编译器从值的类型中推断出哪个分支。你可以消除善良吗?或者如果你无缘无故地弄错了,我必须编写 UB 的代码吗?
标签: c++ arrays algorithm templates