我有一个模板类,如下所示:
template <typename _Tp>
class CLayer{
public:
void AddLayer(CLayer *_layer);
private:
_Tp m_data;
CLayer *m_layer;
};
然后我想将一个双层添加到一个int层。
int main()
{
CLayer<double> dlayer;
CLayer<int> ilayer;
ilayer.AddLayer(dlayer); // this expression is wrong;
// here, the AddLayer function is
// void CLayer<int>::AddLayer(CLayer<int> *_layer);
return 0;
}
如何实现。
我知道我可以将类型CLayer<double> *
转换为CLayer<int> *
,但是以后我会使用数据,我必须知道数据类型是double类型。
答案 0 :(得分:2)
有name injection,因此您的代码是:
template <typename T>
class CLayer
{
public:
void AddLayer(CLayer<T>* layer);
private:
T m_data;
CLayer<T>* m_layer;
};
您必须进行一些更改。可能的解决方案可能是:
template <typename T, typename Next = void>
class CLayer
{
public:
void AddLayer(Next* layer);
private:
T m_data;
Next* m_layer = nullptr;
};
然后
CLayer<double> dlayer;
CLayer<int, CLayer<double>> ilayer;
ilayer.AddLayer(dlayer);
答案 1 :(得分:1)
您不能执行此操作,因为模板类型不是没有模板参数的类型。这意味着public class Sila3bFragment extends Fragment {
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View mView = inflater.inflate(R.layout.fragment_tab2, container, false);
final WebView mWb = (WebView) mView.findViewById(R.id.wv_Tab2);
mWb.loadUrl("file:///android_asset/web/sila3/pagemaknaC.html");
mWb.getSettings().setJavaScriptEnabled(true);
return mView;
}
}
在您指定其模板参数之前不是可用的类型,不能像您正在使用的那样单独使用。
要在不引入可变参数模板的情况下解决问题,可以使用继承,但这将迫使您仅从类本身内部使用数据(或提供一些技巧性的机制来获取数据),例如:
CLayer