无法使用将模板用作方法中的参数的结构

时间:2011-02-10 18:19:28

标签: c++

我有以下代码:

template <typename A, typename B>
struct TheStruct {
    A a;
    B b;
};

class TheClass {
public:
    void do_something(TheStruct<A,B> blah);
}

我在类似do_somethng ...

error: 'A' was not declared in this scope方法上遇到编译器错误

在方法参数中定义此类型的正确语法是什么?

谢谢!

3 个答案:

答案 0 :(得分:2)

您需要将TheClass设为模板:

template <typename A, typename B>
class TheClass {
public:
    void do_something(TheStruct<A,B> blah);
};

或者您需要将do_something()作为模板:

class TheClass {
public:
    template <typename A, typename B>
    void do_something(TheStruct<A,B> blah);
};

答案 1 :(得分:0)

A和B只是模板定义中的占位符。为清楚起见:您的模板定义在语义上与

相同
template <typename TotallyDifferentA, typename TotallyDifferentB>
struct TheStruct {
    TotallyDifferentA a;
    TotallyDifferentB b;
};

所以这并不奇怪

void do_something(TheStruct<A,B> blah);

无法编译。 A和B未定义。这编译:

class TheClass {
public:
    void do_something(TheStruct<int,void(*)(double,char*)> blah);
} ;

答案 2 :(得分:0)

这取决于。您是否希望do_something能够使用任何版本的TheStruct或一个特定版本(例如,A类型为intB为{{1} }}?

对于第一种情况,您需要将doubleTheClass作为模板(例如从@PigBen获取的示例):

do_something

OR

template <typename A, typename B>
class TheClass {
public:
    void do_something(TheStruct<A,B> blah);
};

如果您只需要使用class TheClass { public: template <typename A, typename B> void do_something(TheStruct<A,B> blah); }; 的一个特定实例,那么您可以指定确切的类型:

TheStruct