C ++结构模板

时间:2012-11-26 15:55:09

标签: c++ templates struct

我尝试使用模板和结构,但它们不起作用。我搜索了很多,但我找不到解决方案。

#include <iostream>

using namespace std;

template<struct S>
int add(S s) {
    return s.num + s.num2;
}

int main() {

    struct {
        int num = 10;
        int num2 = 20;
    } test;

    cout << add(test) << endl;
    return 0;
}

使用gcc,错误是:

test.cpp:5:17: error: ‘struct S’ is not a valid type for a template non-type parameter
test.cpp: In function ‘int add(S)’:
test.cpp:6:5: error: ‘s’ has incomplete type
test.cpp:5:17: error: forward declaration of ‘struct S’
test.cpp: In function ‘int main()’:
test.cpp:13:19: warning: non-static data member initializers only available with -std=c++11 or -std=gnu++11 [enabled by default]
test.cpp:14:20: warning: non-static data member initializers only available with -std=c++11 or -std=gnu++11 [enabled by default]
test.cpp:17:21: error: no matching function for call to ‘add(main()::<anonymous struct>&)’
test.cpp:17:21: note: candidate is:
test.cpp:6:5: note: template<<declaration error> > int add(S)
test.cpp:6:5: note:   template argument deduction/substitution failed:
test.cpp:17:21: note:   cannot convert ‘test’ (type ‘main()::<anonymous struct>’) to type ‘S’

5 个答案:

答案 0 :(得分:8)

您无法在此处使用关键字struct。使用classtypename(您仍然可以使用struct实例化模板。

编辑:您的其他问题与struct中的匿名main有关。不记得我头脑中的规则(也许其他人可以解释它们),但这是一种非常奇怪的做事方式,所以我只提供一个有效的版本:http://ideone.com/VGIogH

有点相关:Can we have an anonymous struct as template argument?

再次编辑:您最初使用struct中的匿名main撰写的内容(在模板中替换struct后)--std=c++11,但没有(即c ++ 03)。

答案 1 :(得分:6)

在C ++中,structclass基本相同,只是默认访问说明符在前者中为public,在后者中为private。另一方面,定义模板类型参数的语法需要使用classtypename关键字(此处不要将class类混淆在OO意义上,它可以是任何类型)。

template <typename S>          // equivalently class S
int add(S s) ...

答案 2 :(得分:1)

除了在模板中用typename替换struct之外,我的编译器(GCC)说你不能直接初始化你的struct成员,所以你可以这样做:

#include <iostream>

using namespace std;

template<typename S>
int add(S s) {
   return s.num + s.num2;

}

int main() {

   struct {
       int num;
       int num2;
   } test;

   test.num = 10;
   test.num2 = 20;

   cout << add(test) << endl;
   return 0;
}

编辑:您必须让模板知道您的结构是什么:

#include <iostream>

using namespace std;

struct MyStruct {
   int num;
   int num2;
};
template<typename S>
int add(S s) {
   return s.num + s.num2;

}

int main() {

   MyStruct test;

   test.num = 10;
   test.num2 = 20;

   cout << add(test) << endl;
   return 0;
}

答案 3 :(得分:1)

你的问题是你曾经看过有人写道:

template<class A>
bool foo( A* a ) { 
  return *a;
}

或类似内容,并认为class意味着A必须是class

这里实际发生的是C ++语法有时很糟糕。回到第一次写入的模板时,他们在模板参数列表中重用了一个关键字(class)来表示“一个类型”,而不是你可以传递给模板的其他东西(比如{{1} })。

这是一个非常令人困惑的语法。碰巧,这相当于上面的内容:

int

除了让A更清楚A可以任何类型。

然而,当template<typename A> bool foo( A* a ) { return *a; } 是在模板参数中指定“类型”的正确方法时,有很多C ++代码,所以C ++继续允许它。

答案 4 :(得分:-2)

它不适用于匿名类型,您必须在函数调用中指定类型:

#include <iostream>

using namespace std;

template<typename S>
int add(S s) {
    return s.num + s.num2;
}

int main() {

    struct A {
        int num = 10;
        int num2 = 20;
    } test;

    cout << add<A>(test) << endl;
    return 0;
}