gpt4 book ai didi

c++ - 使用具有相同参数的不同模板模板参数重载函数时出错

转载 作者:太空狗 更新时间:2023-10-29 21:34:17 24 4
gpt4 key购买 nike

我有一个类,它获取两个模板模板参数并使用一个参数重载一个函数,该参数是一个或另一个模板模板参数,但两次都使用相同的模板参数:

template<template<typename> class TemplArgA, template<typename> class TemplArgB>
class CompileError {
public:
void func(TemplArgA<int> x) {}
void func(TemplArgB<int> x) {}
};

我用的是VC2010,得到

error C2535: 'void CompileError<TemplArgA,TemplArgB>::func(TemplArgA<int>)': member function already defined or declared

在编译上面的代码示例时(甚至不是在模板实例化时,只是代码中有上面的行已经导致编译错误)。

这些相比之下编译得很好:

template<class TemplArgA, class TemplArgB>
class Compiles {
public:
void func(TemplArgA x) {}
void func(TemplArgB x) {}
};

template<template<typename> class TemplArgA, template<typename> class TemplArgB>
class AlsoCompiles {
public:
void func(TemplArgA<int> x) {}
void func(TemplArgB<double> x) {}
};

知道我做错了什么吗?

似乎用 clang++ 编译得很好,所以我想知道它是否可能是 VC2010 中的错误...如果是:知道如何解决它吗?

最佳答案

Don't have a choice, must use VC2010 :(

If so: Any idea how to work around it?

所以,你可以试试

template<template<typename> class TemplArgA, template<typename> class TemplArgB>
class CompileError {
public:
void func(TemplArgA<int> x) {}
void func(TemplArgB<int> x,void* workaround = 0) {}

当然,这并不严格等同于您的原始代码(因为在 TemplArgA==TemplArgB 情况下,直到函数实例化之前您不会收到错误;我不知道这是否与您相关)

But in the real code, I don't have just TemplArgA and TemplArgB, but 4 template template parameters (say TemplArgA to TemplArgD) -- I don't think I can apply the workaround then?

你只需要让编译器相信这些重载是不等价的:

template<int> struct workaround_t{};

void func(TemplArgA<int> x, workaround_t<0>* workaround = 0) {}
void func(TemplArgB<int> x, workaround_t<1>* workaround = 0) {}
void func(TemplArgC<int> x, workaround_t<2>* workaround = 0) {}
//...

关于c++ - 使用具有相同参数的不同模板模板参数重载函数时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47057344/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com