gpt4 book ai didi

c++ - 嵌套模板 gcc 编译器 4.1.2 错误

转载 作者:太空狗 更新时间:2023-10-29 12:22:18 24 4
gpt4 key购买 nike

我正在尝试创建一个模板类来将用户与数据类型隔离开来。我更愿意使用适配器类,但函数签名需要更改,需要模板。

在下面的代码示例中(不是实际项目,只是一个简化版本来说明问题),而在主例程中,我可以使用 ob_traits 接口(interface)。但是,当我尝试创建使用 ob_traits 作为基类的模板化 StructWrapper 时,出现错误并且 gcc 无法识别创建的 IntAdapter 类。这在 MSVC 8.0 上编译但在 gcc 4.1.2 20070626 (Red hat 4.1.2-14) 上失败

那么首先有两个问题,你明白为什么编译失败并出现下面指定的错误吗?

其次,关于如何以更简单的方式实现这个概念有什么建议吗?

    #include <iostream>

template <typename T >
struct ob_traits
{
ob_traits( T& param ) { value = param; };
T value;
};

struct GeneralStructure
{
int a;
GeneralStructure(int param):a(param){}
};

struct DifferentStructure
{
GeneralStructure hidden;
DifferentStructure( int param ):hidden(param){};
}
;

/*template< typename T > struct ob_traits
{
};
*/
template<> struct ob_traits< GeneralStructure >
{
struct IntAdapter
{
IntAdapter( GeneralStructure& valueParam ):value(valueParam){}
GeneralStructure value;
int& getValue() { return value.a; };
};
};

template<> struct ob_traits< DifferentStructure >
{
struct IntAdapter
{
IntAdapter( DifferentStructure& valueParam):value( valueParam ){}
DifferentStructure value;
int& getValue( ){ return value.hidden.a; };
};
void dump()
{
DifferentStructure testLocal(44);
IntAdapter local( testLocal );
std::cout << local.getValue()<<std::endl;
}
};

template <typename T > struct StructWrapper:public ob_traits< T >
{
StructWrapper(){};
/*main.cpp:60: error: 'IntAdapter' was not declared in this scope
main.cpp:60: error: expected `;' before 'inner'
main.cpp:60: error: 'inner' was not declared in this scope
*/
void dumpOuter(const T& tempParam) { IntAdapter inner(tempParam); inner.dump(); };
/*
main.cpp: In member function 'void StructWrapper<T>::dumpOuterFailsAsWell(const T&)':
main.cpp:66: error: expected `;' before 'inner'
main.cpp:66: error: 'inner' was not declared in this scope
*/
void dumpOuterFailsAsWell(const T& tempParam) { ob_traits<T>::IntAdapter inner(tempParam); inner.dump(); };
};

int main(int argc, char* argv[])
{
GeneralStructure dummyGeneral(22);
ob_traits<struct GeneralStructure >::IntAdapter test(dummyGeneral);
DifferentStructure dummyDifferent(33);
ob_traits<struct DifferentStructure >::IntAdapter test2(dummyDifferent);
std::cout << "GeneralStructure: "<<test.getValue()<<std::endl;
std::cout << "DifferentStructure: "<<test2.getValue()<<std::endl;
ob_traits<struct DifferentStructure > test3;
test3.dump();
std::cout << "Test Templated\n";
return 0;
}

最佳答案

dumpOuter 失败,因为 IntAdapter 需要限定(如所引用的问题)。 dumpOuterFailsAsWell 失败是因为 GCC 解析了这段代码,即使它不完整,所以它需要知道它是你所指的类型:

void dumpOuterWorks(const T& tempParam) 
{
typename ob_traits<T>::IntAdapter inner(tempParam);
inner.dump();
}

如果此处没有 typename,GCC 将假设 IntAdapter 是一个标识符,并希望您形成一个表达式而不是变量声明。

另请注意,您不必在方法体后放置分号!

关于c++ - 嵌套模板 gcc 编译器 4.1.2 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/267179/

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